Xcode 9 beta的安全区
安全区是布局指南(安全区布局指南)。布局指南表示视图中由酒吧和其他内容遮挡的部分。在iOS 11中,苹果公司正在弃用顶部和底部布局指南,并使用单个安全区域布局指南替换它们。当视图在屏幕上可见时,本指南反映视图中未被其他内容覆盖的部分。视图的安全区域反映了导航栏,标签栏,工具栏和掩盖视图控制器视图的其他祖先覆盖的区域。(在tvOS中,安全区域包含屏幕的屏幕,由overscanCompensationInsetsUIScreen 的属性定义)。它还涵盖视图控制器additionalSafeAreaInsets属性定义的任何其他空间。如果视图当前未安装在视图层次结构中,或者屏幕上尚未显示,则布局指南始终与视图的边缘匹配。对于视图控制器的根视图,此属性中的安全区域表示视图控制器内容被遮蔽的整个部分,以及您指定的任何其他插入。对于视图层次结构中的其他视图,安全区域仅反映该视图中被遮蔽的部分。例如,如果视图完全位于其视图控制器根视图的安全区域内,则此属性中的边缘插入为0。
根据Apple,Xcode 9 - 发行说明
Interface Builder使用UIView.safeAreaLayoutGuide作为UIViewController中不推荐的Top和Bottom布局指南的替代品。要使用新的安全区域,请在视图控制器的文件检查器中选择安全区域布局指南,然后在内容和新的安全区域锚点之间添加约束。这可以防止您的内容被顶部和底部栏以及tvOS上的过扫描区域所掩盖。部署到早期版本的iOS时,安全区域的约束将转换为顶部和底部。
以下是示例代码: 如果您在代码中创建约束,请使用UIView的safeAreaLayoutGuide属性来获取相关的布局锚点。让我们在代码中重新创建上面的Interface Builder示例,看看它的外观:
假设我们在视图控制器中有绿色视图作为属性:
private let greenView = UIView()
我们可能有一个功能来设置从viewDidLoad调用的视图和约束:
private func setupView() {
greenView.translatesAutoresizingMaskIntoConstraints = false
greenView.backgroundColor = .green
view.addSubview(greenView)
}
始终使用根视图的layoutMarginsGuide创建前导和尾随边距约束:
let margins = view.layoutMarginsGuide
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
])
现在,除非您仅定位到iOS 11,否则您需要将#available的安全区域布局指南约束包装起来,并回到早期iOS版本的顶部和底部布局指南:
if #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
])
} else {
let standardSpacing: CGFloat = 8.0
NSLayoutConstraint.activate([
greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing)
])
}
苹果官网文档:https://developer.apple.com/documentation/uikit/uiview/2891102-safearealayoutguide