【问题标题】:Custom container does not adjust correctly layout to in-call status bar自定义容器未正确调整布局以适应通话状态栏
【发布时间】:2017-10-10 13:47:11
【问题描述】:

我正在使用我自己的模态容器视图控制器 从根视图控制器呈现(因此容器不是根视图控制器本身)。当显示通话状态栏时,根视图控制器会正确处理其布局。现在,如果我以模态方式呈现自定义容器及其子容器(比如说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 及其继任者),或者似乎是有点太重了(观察状态栏确实会改变以适应布局),特别是考虑到直接呈现子视图控制器时,它的行为是正确的。

【问题讨论】:

    标签: ios iphone swift uiviewcontroller swift4


    【解决方案1】:

    在玩了之后,我能够确定设置的框架存在问题 - 容器视图控制器的框架似乎被偏移但在调用 initialTransition(to:) 时没有调整大小(在容器的 viewDidLoad 中) ,从而导致孩子获得一个与屏幕底部重叠的框架,偏移量 - 20 点。

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      相关资源
      最近更新 更多