Safe Area 是一个布局指南(Safe Area Layout Guide)。
布局指南,代表视图中未被条形和其他内容遮挡的部分。在 iOS 11+ 中,Apple 弃用了顶部和底部布局指南,并用单一安全区域布局指南取而代之。
当视图在屏幕上可见时,本指南会反映视图中未被其他内容覆盖的部分。视图的安全区域反映了导航栏、选项卡栏、工具栏和其他遮挡视图控制器视图的祖先所覆盖的区域。(在 tvOS 中,安全区域包含屏幕的边框,由overscanCompensationInsets
UIScreen 的属性定义。)它还覆盖了视图控制器additionalSafeAreaInsets
属性定义的任何额外空间。如果视图当前未安装在视图层次结构中,或者在屏幕上尚不可见,则布局指南始终与视图的边缘匹配。
对于视图控制器的根视图,此属性中的安全区域表示视图控制器内容的整个被遮挡部分,以及您指定的任何其他插图。对于视图层次结构中的其他视图,安全区域仅反映该视图中被遮挡的部分。例如,如果一个视图完全位于其视图控制器的根视图的安全区域内,则该属性中的边插入为 0。
根据 Apple 的说法,Xcode 9 - Release note
Interface Builder 使用 UIView.safeAreaLayoutGuide 作为 UIViewController 中已弃用的 Top 和 Bottom 布局指南的替代品。要使用新的安全区域,请在视图控制器的文件检查器中选择 Safe Area Layout Guides,然后在您的内容和新的安全区域锚点之间添加约束。这可以防止您的内容被顶部和底部条以及 tvOS 上的过扫描区域遮挡。部署到早期版本的 iOS 时,安全区域的约束将转换为顶部和底部。
这是现有(顶部和底部)布局指南和安全区域布局指南之间的比较(以产生相似的视觉效果)的简单参考。
安全区域布局:
自动布局
如何使用安全区域布局?
请按照以下步骤查找解决方案:
- 如果未启用,则启用“安全区域布局”。
- 如果它们显示与超级视图的连接,则删除“所有约束”并使用安全布局锚重新附加所有约束。或 双击约束并编辑从超级视图到 SafeArea 锚点的连接
这是示例快照,如何启用安全区域布局和编辑约束。
这是上述更改的结果
使用 SafeArea 进行布局设计
在为 iPhone X 设计时,您必须确保布局填满屏幕,并且不会被设备的圆角、传感器外壳或用于访问主屏幕的指示器遮挡。
大多数使用系统提供的标准 UI 元素(如导航栏、表格和集合)的应用程序会自动适应设备的新外形。背景材料延伸到显示器的边缘,并且 UI 元素被适当地插入和定位。
对于具有自定义布局的应用程序,支持 iPhone X 也应该相对容易,特别是如果您的应用程序使用自动布局并遵守安全区域和边距布局指南。
这是示例代码(参考:安全区域布局指南):
如果您在代码中创建约束,请使用 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)
])
}
结果:
在UIView
扩展之后,您可以轻松地以编程方式使用 SafeAreaLayout。
extension UIView {
// Top Anchor
var safeAreaTopAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.topAnchor
} else {
return self.topAnchor
}
}
// Bottom Anchor
var safeAreaBottomAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.bottomAnchor
} else {
return self.bottomAnchor
}
}
// Left Anchor
var safeAreaLeftAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.leftAnchor
} else {
return self.leftAnchor
}
}
// Right Anchor
var safeAreaRightAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.rightAnchor
} else {
return self.rightAnchor
}
}
}
这是Objective-C中的示例代码:
这是 Apple Developer Official Documentation for Safe Area Layout Guide
需要安全区域来处理 iPhone-X 的用户界面设计。这是如何使用安全区域布局为 iPhone-X 设计用户界面的基本指南