使用formSheet呈现样式

时间:2019-07-12 01:40:36

标签: ios cocoa-touch uiviewcontroller uikit

在展示视图控制器之前,我们可以将modalPresentationStyle设置为.formSheet,然后设置preferredContentSize来控制展示的模式的大小:

let controller = ModalViewController()
controller.modalPresentationStyle = .formSheet
controller.preferredContentSize = CGSize(width: 200, height: 200)
present(controller, animated: true)

enter image description here

一旦显示,是否有办法调整此模式的大小?例如,如果显示的视图控制器是具有用于创建帐户的选项的登录表单,则电子邮件和密码的两个字段可能会扩展以收集名字和姓氏。我们如何增加模态的大小以容纳它们?

我已经更新了preferredContentSize,但是一旦显示了视图控制器,它似乎就没有任何作用。

2 个答案:

答案 0 :(得分:0)

设置新的preferredContentSize后,调用此名称:

if let superView = view.superview?.superview {
    superView.setNeedsLayout()
}

我如何找到它?我将应用程序发送到后台,然后再次输入,以发现视图控制器已设置为正确的大小,然后使用视图层次结构调试器查看父视图,然后查看一些错误信息。

-编辑:

更可靠的实现:

var brokenView = view
while brokenView != nil {
    brokenView?.setNeedsLayout()
    brokenView = brokenView?.superview
}

答案 1 :(得分:0)

我已成功使用此技巧来强制更新大小:

self.presentationController?.containerView?.setNeedsLayout()

(至少在我的情况下)self.presentationController?.containerViewUITransitionView是同一对象(即self.view.superview?.superview的实例)。


请注意,如果尚未使用viewController时使用相同的方法来更新preferredContentSize,则:

self.presentationController?.containerViewself.view.superview?.superview都为零,直到实际显示viewController为止,因此在第一种情况下使用可选链接应该是一个安全的noop,并且在viewController尚未出现时也不会产生任何不良副作用呈现。

在第二种情况下,您可能希望使用self.viewIfLoaded?.superview?.superview,以免引起视图加载时间过早。