当子视图不在视图区域中时,安全区域在iPhone X上无法正常工作

时间:2017-09-18 03:28:14

标签: ios xcode autolayout iphone-x

我有一个scrollView包含2个子viewController。你可以看到VC2没有正确布局。

我发现屏幕上还没有显示视图。 safeAreaInsets始终为0.

滚动结束时,我可以调用vc2.view.setNeedsLayout()来解决此问题。 但滚动结束前布局不正确。

document

  

如果视图当前未安装在视图层次结构中,或者不是   但在屏幕上可见,此属性中的边缘插入为0。

那么我该如何解决这种情况。

enter image description here

自动布局 enter image description here enter image description here

4 个答案:

答案 0 :(得分:8)

而不是引用当前视图的safeAreaInsets,将其设置为UIApplication:

(UIApplication.shared.delegate?.window??.safeAreaInsets.bottom)

答案 1 :(得分:1)

在子视图控制器中,如果将视图控制器System.Windows.Forms设置为等于窗口的安全区域插图,则它们将按照安全区域正确布局。

我发现我必须在additionalSafeAreaInsetsviewDidLoad()内这样做

viewWillTransition(to size: CGSize, with coordinator: UIVIewControllerTransitionCoordinator内,您需要在协调器的动画块中设置viewWillTransition

additionalSafeAreaInsets

答案 2 :(得分:1)

我正在构建一个自定义分页视图控制器,并遇到了@PowHU这个问题。

对我来说唯一可行的解​​决方案是将故事板中的视图控制器的视图类设置为我创建的名为AlwaysSafeAreaInsetsView的自定义类。

import UIKit

class AlwaysSafeAreaInsetsView: UIView {

    @available(iOS 11.0, *)
    override var safeAreaInsets: UIEdgeInsets {
        if let window = UIApplication.shared.keyWindow {
            return window.safeAreaInsets
        }
        return super.safeAreaInsets
    }

}

答案 3 :(得分:0)

如果我看得正确,您的容器视图会固定在它的超级视图的顶部和底部。将其固定到安全区域,您的子视图控制器将正确布局。