自定义容器无法正确调整布局,使其处于通话状态栏

时间:2017-10-10 13:47:11

标签: ios iphone swift uiviewcontroller swift4

我正在使用我自己的自定义容器视图控制器,它是模态的 从根视图控制器呈现(因此容器不是根视图控制器本身)。当显示通话中状态栏时,根视图控制器可以正确处理其布局。现在,如果我以模态方式呈现自定义容器及其子项(假设为SomeViewController的实例),则按预期布置子项。如果在显示自定义容器时显示通话中状态栏,则子项将正确调整。

在自定义容器尚未显示时显示通话中状态栏时出现问题。如果我在有通话状态栏时显示自定义容器,子视图的底部会被扩展状态栏的大小(即20点)裁剪 - 看起来框架的大小不是正确,或者设置了偏移量。如果我解除呼叫状态栏,则顶部会调整到新获得的空间,但底部会保持裁剪状态。

以下显示了容器视图的相关代码:

class ContainerController: UIViewController {

    var selectedViewController: UIViewController?

    override func viewDidLoad() {
        super.viewDidLoad()

        if let selectedViewController = selectedViewController {
            initialTransition(to: selectedViewController)
        }
    }

    fileprivate func initialTransition(to viewController: UIViewController) {
        guard self.isViewLoaded else {
            return
        }
        self.addChildViewController(viewController)
        viewController.view.frame = self.view.frame
        self.view.addSubview(viewController.view)
        viewController.didMove(toParentViewController: self)
    }

    // rest of the code omitted
}

在根视图控制器中使用此代码显示容器视图:

let container = ContainerController()
trainingContainer.selectedViewController = SomeViewController()
self.present(trainingContainer, animated: true, completion: nil)

虽然有几个关于类似问题的SO问题(SO questionanother SO question等),但大多数问题都提出了一些不起作用的解决方案(例如,旧wantsFullScreenLayout及其继承者),或者看起来有点太重量级(观察状态栏确实改变了以适应布局),特别是考虑到当直接呈现子视图控制器时,它表现正常。

1 个答案:

答案 0 :(得分:0)

在玩完之后,我能够确定正在设置框架的问题 - 容器视图控制器的框架似乎已经过时,但在调用initialTransition(to:)时没有调整大小(在容器中#39) ; s viewDidLoad),从而导致孩子得到一个与屏幕底部重叠的框架 - 偏移--20分。

我的第一个方法是在容器的viewDidAppear中再次添加框架,这最终解决了问题,但引起了一个小故障 - 片刻底部看起来被裁剪,然后{调用{1}}并正确调整布局。这个故障看起来很糟糕。

我终于通过覆盖容器viewDidAppear并在那里设置孩子的框架来实现我想要的东西(因此当容器被通知将其框架调整到状态栏时,有关新的信息框架被传递给孩子。)

viewDidLayoutSubviews