2017-10-10 53 views
0

我使用的是模態 從根視圖控制器提出了自己的自定義容器視圖控制器(因此容器不是根視圖控制器本身)。顯示通話狀態欄時,根視圖控制器將正確處理其佈局。現在,如果我模式地呈現自定義容器與其子(可以說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佈局),特別是考慮到直接提交子視圖控制器時,它的行爲是正確的。

回答

0

玩弄後,我能夠確定,有與框設一個問題 - 容器視圖控制器的框架似乎offseted但不能調整大小時initialTransition(to:)被稱爲(在容器的viewDidLoad),從而導致該孩子得到一個框架,該框架與屏幕的底部重疊20點。

我的第一種方法是再次在容器的viewDidAppear中添加設置框架,最終解決了問題,但導致一個小故障 - 一會兒底部似乎被裁剪,然後調用viewDidAppear並調整了佈局正確。這個毛病看起來很糟糕。

我終於通過覆蓋容器的viewDidLayoutSubviews並在那裏設置子框架來實現我想要的(因此,當容器得到通知將框架調整到狀態欄時,有關新框架的信息將傳遞給子框架) 。

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