更改模态视图控制器的大小

2024-04-25

一旦用户点击一个按钮,我希望我的 modalViewController 在屏幕中间显示为一个小正方形(您仍然可以在后台看到原始视图控制器)。

我在 stackoverflow 上找到的几乎每个答案都使用故事板来创建模态视图控制器,但我已经找到了所有我发现的东西。

当您点击应该打开模态视图的按钮时,将调用此函数:

func didTapButton() {
    let modalViewController = ModalViewController()
    modalViewController.definesPresentationContext = true
    modalViewController.modalPresentationStyle = .overCurrentContext
    navigationController?.present(modalViewController, animated: true, completion: nil)
}

modalViewController 包含:

import UIKit

class ModalViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .blue
        view.isOpaque = false

        self.preferredContentSize = CGSize(width: 100, height: 100)

    }

}

根据我找到的答案,我的印象是,如果我设置preferredContentSize = CGSize(width: 100, height: 100),那么它将使模态视图控制器变为 100px x 100px。

但是,视图控制器占据了整个屏幕(除了选项卡栏,因为我设置了modalViewController.modalPresentationStyle = .overCurrentContext

我显然在这里错过了一个步骤,但我想以编程方式完成所有操作,因为我在项目中根本没有使用故事板(除了设置打开控制器)

预先感谢您的帮助!


The modalPresentationStyle 文档 https://developer.apple.com/documentation/uikit/uiviewcontroller/1621355-modalpresentationstyle告诉我们

在水平紧凑的环境中,模态视图控制器始终以全屏方式呈现。

因此,如果您想在 iPhone 的纵向模式下执行此操作,则必须指定.custom演示风格并让您的过渡代理提供自定义演示控制器。

我个人会让我的第二个视图控制器管理它自己的呈现参数,所以我的第一个视图控制器可能只会:

class FirstViewController: UIViewController {
    @IBAction func didTapButton(_ sender: Any) {
        let controller = storyboard!.instantiateViewController(withIdentifier: "SecondViewController")
        present(controller, animated: true)
    }
}

然后我的第二个视图控制器将指定自定义转换并指定自定义转换委托:

class SecondViewController: UIViewController {
    private var customTransitioningDelegate = TransitioningDelegate()

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        configure()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        configure()
    }
}

private extension SecondViewController {
    func configure() {
        modalPresentationStyle = .custom
        modalTransitionStyle = .crossDissolve              // use whatever transition you want
        transitioningDelegate = customTransitioningDelegate
    }
}

然后该转换委托将提供自定义呈现控制器:

class TransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
        return PresentationController(presentedViewController: presented, presenting: presenting)
    }
}

该演示控制器将指定其大小:

class PresentationController: UIPresentationController {
    override var frameOfPresentedViewInContainerView: CGRect {
        let bounds = presentingViewController.view.bounds
        let size = CGSize(width: 200, height: 100)
        let origin = CGPoint(x: bounds.midX - size.width / 2, y: bounds.midY - size.height / 2)
        return CGRect(origin: origin, size: size)
    }

    override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?) {
        super.init(presentedViewController: presentedViewController, presenting: presentingViewController)

        presentedView?.autoresizingMask = [
            .flexibleTopMargin,
            .flexibleBottomMargin,
            .flexibleLeftMargin,
            .flexibleRightMargin
        ]

        presentedView?.translatesAutoresizingMaskIntoConstraints = true
    }
}

这只是自定义过渡的冰山一角。您可以指定动画控制器(用于自定义动画)、调暗/模糊背景等。请参阅 WWDC 2013使用视图控制器自定义转换 https://developer.apple.com/videos/play/wwdc2013/218/有关自定义过渡的入门视频和 WWDC 2014 视频查看 iOS 8 中的控制器改进 https://developer.apple.com/videos/play/wwdc2014/214/ and 演示控制器内部一览 https://developer.apple.com/videos/play/wwdc2014/228/深入研究呈现控制器的细节。


例如,当您呈现模态视图时,您可能希望使背景变暗和模糊。所以你可以添加presentationTransitionWillBegin and dismissalTransitionWillBegin要以动画方式呈现此“变暗”视图:

class PresentationController: UIPresentationController {
    ...

    let dimmingView: UIView = {
        let dimmingView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
        dimmingView.translatesAutoresizingMaskIntoConstraints = false
        return dimmingView
    }()

    override func presentationTransitionWillBegin() {
        super.presentationTransitionWillBegin()

        let superview = presentingViewController.view!
        superview.addSubview(dimmingView)
        NSLayoutConstraint.activate([
            dimmingView.leadingAnchor.constraint(equalTo: superview.leadingAnchor),
            dimmingView.trailingAnchor.constraint(equalTo: superview.trailingAnchor),
            dimmingView.bottomAnchor.constraint(equalTo: superview.bottomAnchor),
            dimmingView.topAnchor.constraint(equalTo: superview.topAnchor)
        ])

        dimmingView.alpha = 0
        presentingViewController.transitionCoordinator?.animate(alongsideTransition: { _ in
            self.dimmingView.alpha = 1
        }, completion: nil)
    }

    override func dismissalTransitionWillBegin() {
        super.dismissalTransitionWillBegin()

        presentingViewController.transitionCoordinator?.animate(alongsideTransition: { _ in
            self.dimmingView.alpha = 0
        }, completion: { _ in
            self.dimmingView.removeFromSuperview()
        })
    }
}

得出:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改模态视图控制器的大小 的相关文章

随机推荐

  • 将 D3 svg 保存为高质量图像

    有没有办法将 D3 SVG 图像保存为高质量图像 如果是的话请解释一下 截至目前 我正在使用以下代码将 svg 保存为图像 但我得到的图像质量不高 var canvas1 document createElement canvas canv
  • 如何使用 matplotlib 绘制与比例无关的箭头

    我使用 matplotlib 在 python 中绘制了一条船的轨迹图 如下所示 现在我想添加一些箭头 例如风向 真实航向等 但是 无论绘图处于哪个缩放级别 我都希望箭头具有相同的大小 我尝试了 matplotlib pyplot arro
  • 在asp.net MVC中不使用LabelFor Helper获取DisplayName属性

    检索模型中项目的显示名称属性的最佳方法是什么 我看到很多人使用 LabelFor 助手来处理所有事情 但如果我只想列出数据 则标签不合适 如果我只想将其打印出来 比如说一个段落 是否有一种简单的方法可以获取名称属性 p p p 显然 为了避
  • 从 Xcode 分发时分析应用程序版本时出现什么错误?

    我想分发应用程序 但收到错误消息 我不知道原因 我使用 Xcode 版本 13 0 13A233 遇到错误 Error Analyzing App Version Build number request failed with error
  • 适用于 Hotmail、Gmail 和 Yahoo 的 PHP API? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 C# 中调整图像大小并保持宽高比

    我需要知道一种方法来调整图像大小以适合盒子 而不会使图像拉伸太多 该框已设置宽度和高度 我希望图像尽可能多地填充框 但保持其原始的纵横比 calculate the ratio double dbl double image Width d
  • cronjob 上的 PHP 错误,在提示时工作正常

    我正在 cronjob 上运行以下脚本 cd etc parselog php run all php gt dev null 并收到以下错误 05 May 2009 20 30 12 PHP Warning PHP Startup Una
  • 如何仅使用 CSS 制作图像轮播?

    我正在寻找制作一个图像轮播 用户可以通过单击箭头在图像之间切换 例如 但是 我只能使用 HTML 和 CSS 不能使用 JavaScript 因此也不能使用 jQuery 我只需要基本设置 平滑过渡等不是必需的 我怎样才能做到这一点 这很容
  • 无效参数:隔离消息中的非法参数:(对象是aReceivePort)

    我不确定我在这段代码中是否做错了什么 但我在生成新隔离时显然传递了 SendPort 但是当我调用时 Infrastructure instance initialize 我收到以下异常 Invalid argument s Illegal
  • int q = {1,2};特殊的初始化列表

    我遇到了下面的初始化 可以看出VS2012 显示一个错误 抱怨初始化程序太多 在海湾合作委员会看来 返回第一个元素作为值 为什么 GCC 支持这种特殊的初始化 include
  • Git 日志仅获取特定分支的提交

    我想列出仅属于特定分支的所有提交 通过以下内容 它列出了来自分支的所有提交 也列出了来自父级 主 的所有提交 git log mybranch 我发现的另一个选项是排除 master 可到达的提交并给我我想要的东西 但我想避免需要知道其他分
  • 如何交换“NSMutableDictionary”键和值?

    我有一个NSMutableDictionary我想交换值和键 即 交换值后成为键 并且其对应的键成为值 所有键和值都是唯一的 寻找就地解决方案 因为尺寸非常大 此外 键和值是NSString物体 NSMutableDictionary d
  • C# 中“dynamic”和“object”关键字有什么区别? [复制]

    这个问题在这里已经有答案了 谁能简单解释一下 C 中 dynamic 和 object 关键字之间的区别 object 让我们先快速浏览一下 object 关键字 我不会谈论太多 因为它从 C 1 0 就已经存在了 该关键字只不过是 Sys
  • 如何检查单个精灵帧期间的重叠情况?并在玩家与帧重叠的每个循环中仅从玩家生命值中减去 1?

    我有一个尖峰精灵 其循环中有 4 个帧 当玩家与尖峰精灵的第三帧重叠时 我想从健康变量中减去 1 目前 on 函数无法正确加载 我的游戏可以运行 但重叠功能根本无法运行 我编辑了收到的代码 并删除了我认为不需要的方面 测试了原始代码示例以检
  • Pygame 弹力球穿过地板下沉

    下面的代码会弹起一个球 但由于某种原因 球在完成弹跳后会穿过地面 有人知道为什么吗 代码的想法是一个球从左上角开始 然后下落并弹起 然后向上和向下移动 依此类推 直到它停止弹跳 但是当它停止弹跳时 它开始抖动并慢慢下沉到地面 我不知道为什么
  • 如何删除已发布的 wmi 架构?

    我已经发布了架构 并且不再拥有包含发布该架构的 wmi 提供程序的 dll 如何删除架构 如果您正在谈论其他问题中的程序集 您可以简单地使用 wbemtest exe 连接到根命名空间 枚举实例 按钮 超类 名称 命名空间 删除名为 Tes
  • Visual Studio 2013 Shell(独立)安装失败并出现错误 997:重叠 I/O 操作正在进行

    我正在尝试在 Windows 7 Pro 计算机上安装 Visual Studio 2013 Express for Desktop 我已经下载了 ISO 文件并在本地运行它 我运行安装程序并收到有关未安装某些先决条件 其中之一是 C 运行
  • 局部变量隐藏字段是什么意思?

    所以这只是我代码的一部分 整个程序编译并运行 但我不断在以 GameBoard myBoard this getGameBoard 开头的三行旁边看到 局部变量隐藏字段 我 我只是好奇这实际上意味着什么 以及从长远来看它是否对我的程序有任何
  • 从 .csv 文件读取值并将其转换为浮点数组

    我偶然发现了一个小编码问题 我基本上必须从 csv 文件中读取数据 该文件看起来很像这样 2011 06 19 17 29 00 000 72 44 56 0 4772 0 3286 0 8497 31 3587 0 3235 0 9147
  • 更改模态视图控制器的大小

    一旦用户点击一个按钮 我希望我的 modalViewController 在屏幕中间显示为一个小正方形 您仍然可以在后台看到原始视图控制器 我在 stackoverflow 上找到的几乎每个答案都使用故事板来创建模态视图控制器 但我已经找到