iOS - 自定义演示控制器不会为拆分视图适当更新显示的navigationBar高度

时间:2016-06-30 16:37:15

标签: ios ipad

我创建了自己的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)并且将留下间隙或延伸超过其边界。

1 个答案:

答案 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)
        }

这看起来确实有点脆弱,但它对我来说很好。