在展示视图控制器之前,我们可以将modalPresentationStyle
设置为.formSheet
,然后设置preferredContentSize
来控制展示的模式的大小:
let controller = ModalViewController()
controller.modalPresentationStyle = .formSheet
controller.preferredContentSize = CGSize(width: 200, height: 200)
present(controller, animated: true)
一旦显示,是否有办法调整此模式的大小?例如,如果显示的视图控制器是具有用于创建帐户的选项的登录表单,则电子邮件和密码的两个字段可能会扩展以收集名字和姓氏。我们如何增加模态的大小以容纳它们?
我已经更新了preferredContentSize
,但是一旦显示了视图控制器,它似乎就没有任何作用。
答案 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?.containerView
与UITransitionView
是同一对象(即self.view.superview?.superview
的实例)。
请注意,如果尚未使用viewController时使用相同的方法来更新preferredContentSize,则:
self.presentationController?.containerView
和self.view.superview?.superview
都为零,直到实际显示viewController为止,因此在第一种情况下使用可选链接应该是一个安全的noop,并且在viewController尚未出现时也不会产生任何不良副作用呈现。
在第二种情况下,您可能希望使用self.viewIfLoaded?.superview?.superview
,以免引起视图加载时间过早。