定制容器不正确布局调整的通话中状态栏

定制容器不正确布局调整的通话中状态栏

问题描述:

我使用的是模态 从根视图控制器提出了自己的自定义容器视图控制器(因此容器不是根视图控制器本身)。显示通话状态栏时,根视图控制器将正确处理其布局。现在,如果我模式地呈现自定义容器与其子(可以说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及其后继者),还是显得有点过于重量级(观察状态栏也更改为ADAP t布局),特别是考虑到直接提交子视图控制器时,它的行为是正确的。

玩弄后,我能够确定,有与框设一个问题 - 容器视图控制器的框架似乎offseted但不能调整大小时initialTransition(to:)被称为(在容器的viewDidLoad),从而导致该孩子得到一个框架,该框架与屏幕的底部重叠20点。

我的第一种方法是再次在容器的viewDidAppear中添加设置框架,最终解决了问题,但导致一个小故障 - 一会儿底部似乎被裁剪,然后调用viewDidAppear并调整了布局正确。这个毛病看起来很糟糕。

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

override func viewDidLayoutSubviews() { 
    self.selectedViewController?.view.frame = self.view.frame 
    super.viewDidLayoutSubviews() 
}