Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义容器未将布局正确调整到调用状态栏中_Ios_Iphone_Swift_Uiviewcontroller_Swift4 - Fatal编程技术网

Ios 自定义容器未将布局正确调整到调用状态栏中

Ios 自定义容器未将布局正确调整到调用状态栏中,ios,iphone,swift,uiviewcontroller,swift4,Ios,Iphone,Swift,Uiviewcontroller,Swift4,我使用自己的自定义容器视图控制器 从根视图控制器显示(因此容器本身不是根视图控制器)。当显示in-call状态栏时,根视图控制器将正确处理其布局。现在,如果我将定制容器与其子容器(比如说SomeViewController的实例)以模态方式呈现,那么子容器的布局将与预期的一样。如果在已显示自定义容器的情况下显示调用中状态栏,则子容器将正确调整 当显示in call状态栏而尚未显示自定义容器时,会出现问题。如果在存在调用中状态栏时显示自定义容器,则子视图的底部会被扩展状态栏的大小(即20个点)裁剪

我使用自己的自定义容器视图控制器 从根视图控制器显示(因此容器本身不是根视图控制器)。当显示in-call状态栏时,根视图控制器将正确处理其布局。现在,如果我将定制容器与其子容器(比如说
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()
}