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

Ios 当子视图不在视图区域中时,安全区域在iPhone X上无法正常工作,ios,xcode,autolayout,iphone-x,Ios,Xcode,Autolayout,Iphone X,我有一个scrollView包含2个子viewController。您可以看到VC2布局不正确 我发现如果视图在屏幕上还不可见。 安全区域插图始终为0 我可以调用vc2.view.setNeedsLayout()在滚动结束时修复此问题。 但直到滚动结束,布局才正确 警察说 如果视图当前未安装在视图层次结构中,或者 但在屏幕上可见,此属性中的边插入为0 那么我该如何解决这个问题呢 自动布局 如果我看得清楚,您的容器视图将固定在superview的顶部和底部。将其固定到安全区域,您的子视图控制器将

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

我发现如果视图在屏幕上还不可见。
安全区域插图
始终为0

我可以调用
vc2.view.setNeedsLayout()
在滚动结束时修复此问题。 但直到滚动结束,布局才正确

警察说

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

那么我该如何解决这个问题呢

自动布局

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

将其设置为UIApplication,而不是引用当前视图的安全区域插图:

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

在子视图控制器中,如果将视图控制器
additionalSafeAreaInsets
设置为与窗口的安全区域insets相等,则它们将根据安全区域正确布局

我发现我必须在
viewDidLoad()
viewWillTransition(到size:CGSize,带有协调器:UIVIewControllerTransitionCoordinator

viewWillTransition
的内部,您需要在协调器的动画块中设置
附加安全区域插入项

coordinator.animate(alongsideTransition: { _ in
    if #available(iOS 11.0, *) {
        self.additionalSafeAreaInsets = UIApplication.shared.delegate?.window??.safeAreaInsets
    }
}, completion: nil)

我在构建一个定制的分页视图控制器时,也遇到了这个问题@PowHU

对我来说唯一可行的解决方案是将情节提要中视图控制器的视图类设置为我创建的名为
AlwaysSafeAreaInsetsView
的自定义类

导入UIKit
类AlwaysSAFEAREAInsertsView:UIView{
@可用(iOS 11.0,*)
覆盖var安全区域插图:UIEdgeInsets{
如果let window=UIApplication.shared.keyWindow{
返回窗口。安全区域插图
}
返回super.safeAreaInsets
}
}

您需要提供更多信息,向我们展示“VC1底部”和“VC2底部”的约束是什么样子的。它们完全相同吗?是的。它们是安全区域中心和安全区域底部的相同约束。您是否厌倦了将
VC2.view.setNeedsLayout()
放在
ViewDidLayoutSubView()
或类似的内容中?(通过适当的测试来防止潜在的无限循环)
viewdilayoutsubviews()
是相同的。当视图不在屏幕上时,安全区域始终为0。找到解决方案吗?我有相同的问题,目标是iOS10,我不能使用
安全区域插入项
否。我希望容器视图的大小与superView相同。
安全区域插入项
仅适用于iOS 11.0或新版本。好的,afaiak旧设备没有安全区域还是插入的