我创建了自己的UIPresentationController
子类,我正在使用它来呈现导航控制器。目的是在某种程度上模仿UIPopoverPresentationController的行为,但允许更多的自定义。
所以我遇到的问题是,当用户使用splitview调整应用程序的大小时,在iPad上,导航栏的高度无法正确更新。
当视图处于弹出式样式时,导航栏应使用高度44,当它采用全屏样式时,它使用高度64.这在首次呈现控制器时正确发生。但是,如果用户使用splitview调整应用程序,则导航栏高度根本不会更新。
在我的UIPresentationController
子类中,我正在执行以下操作:
我根据容器视图的宽度设置框架:
override func frameOfPresentedViewInContainerView() -> CGRect {
if let containerView = containerView {
if containerView.bounds.width > 500 {
let preferredSize = presentedViewController.preferredContentSize
return CGRect(x: containerView.bounds.width - preferredSize.width - 20, y: 16, width: preferredSize.width, height: preferredSize.height)
} else {
return containerView.bounds
}
} else {
return CGRectZero
}
}
然后每当我收到willLayoutSubviews电话时都会更新帧:
override func containerViewWillLayoutSubviews() {
presentedViewController.view.frame = frameOfPresentedViewInContainerView()
}
当我检查presentViewController的视图时,它获取所有正确的值,并且在视觉上是正确的大小。 唯一问题是导航栏将保持其最初呈现的高度(无论是44还是64)并且将留下间隙或延伸超过其边界。
答案 0 :(得分:0)
看来我找到了一个有效的解决方案。在我的containerViewWillLayoutSubviews
函数中,我只需访问导航控制器的navigationBar
属性并正确设置其框架。
if let navigationController = presentedViewController as? UINavigationController {
navigationController.navigationBar.frame = CGRect(x: 0,
y: 0,
width: presentedViewController.view.frame.size.width,
height: containerView.bounds.width > 500 ? 44 : 64)
}
这看起来确实有点脆弱,但它对我来说很好。