Ios 自定义容器未将布局正确调整到调用状态栏中
我使用自己的自定义容器视图控制器 从根视图控制器显示(因此容器本身不是根视图控制器)。当显示in-call状态栏时,根视图控制器将正确处理其布局。现在,如果我将定制容器与其子容器(比如说Ios 自定义容器未将布局正确调整到调用状态栏中,ios,iphone,swift,uiviewcontroller,swift4,Ios,Iphone,Swift,Uiviewcontroller,Swift4,我使用自己的自定义容器视图控制器 从根视图控制器显示(因此容器本身不是根视图控制器)。当显示in-call状态栏时,根视图控制器将正确处理其布局。现在,如果我将定制容器与其子容器(比如说SomeViewController的实例)以模态方式呈现,那么子容器的布局将与预期的一样。如果在已显示自定义容器的情况下显示调用中状态栏,则子容器将正确调整 当显示in call状态栏而尚未显示自定义容器时,会出现问题。如果在存在调用中状态栏时显示自定义容器,则子视图的底部会被扩展状态栏的大小(即20个点)裁剪
SomeViewController
的实例)以模态方式呈现,那么子容器的布局将与预期的一样。如果在已显示自定义容器的情况下显示调用中状态栏,则子容器将正确调整
当显示in call状态栏而尚未显示自定义容器时,会出现问题。如果在存在调用中状态栏时显示自定义容器,则子视图的底部会被扩展状态栏的大小(即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问题(,等等),但其中大多数建议要么解决方案不起作用(例如,old及其继任者),要么似乎有点太重(观察状态栏确实改变了以适应布局),特别是考虑到直接显示子视图控制器时,它运行正常。在玩过之后,我能够确定设置的帧有问题-调用
initialTransition(to:)
时(在容器的viewDidLoad中),容器视图控制器的帧似乎偏移了,但没有调整大小,从而使子屏幕获得一个与屏幕底部重叠偏移-20点的帧
我的第一个方法是在容器的viewdideappear
中再次添加设置帧,这最终解决了问题,但导致了一个小故障-有一段时间底部似乎被裁剪了,然后调用了viewdideappear
,并正确调整了布局。这个小故障看起来很糟糕
通过覆盖容器的viewdilayoutsubviews
并在那里设置子容器的框架,我最终实现了我想要的结果(因此,当通知容器将其框架调整到状态栏时,有关新框架的信息会传递给子容器)
在玩过之后,我能够确定设置的帧有问题-调用initialTransition(to:)
时(在容器的viewDidLoad
中),容器视图控制器的帧似乎偏移了,但没有调整大小,从而使子屏幕获得一个与屏幕底部重叠偏移-20点的帧
我的第一个方法是在容器的viewdideappear
中再次添加设置帧,这最终解决了问题,但导致了一个小故障-有一段时间底部似乎被裁剪了,然后调用了viewdideappear
,并正确调整了布局。这个小故障看起来很糟糕
通过覆盖容器的viewdilayoutsubviews
并在那里设置子容器的框架,我最终实现了我想要的结果(因此,当通知容器将其框架调整到状态栏时,有关新框架的信息会传递给子容器)
override func viewDidLayoutSubviews() {
self.selectedViewController?.view.frame = self.view.frame
super.viewDidLayoutSubviews()
}