?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