?Xcode 9 beta的安全區(qū)
安全區(qū)是布局指南(安全區(qū)布局指南)。布局指南表示視圖中由酒吧和其他內(nèi)容遮擋的部分枕荞。在iOS 11中柜候,蘋果公司正在棄用頂部和底部布局指南,并使用單個(gè)安全區(qū)域布局指南替換它們躏精。當(dāng)視圖在屏幕上可見時(shí)渣刷,本指南反映視圖中未被其他內(nèi)容覆蓋的部分。視圖的安全區(qū)域反映了導(dǎo)航欄矗烛,標(biāo)簽欄辅柴,工具欄和掩蓋視圖控制器視圖的其他祖先覆蓋的區(qū)域。(在tvOS中高诺,安全區(qū)域包含屏幕的屏幕碌识,由overscanCompensationInsetsUIScreen?的屬性定義)。它還涵蓋視圖控制器additionalSafeAreaInsets屬性定義的任何其他空間虱而。如果視圖當(dāng)前未安裝在視圖層次結(jié)構(gòu)中筏餐,或者屏幕上尚未顯示,則布局指南始終與視圖的邊緣匹配牡拇。對(duì)于視圖控制器的根視圖魁瞪,此屬性中的安全區(qū)域表示視圖控制器內(nèi)容被遮蔽的整個(gè)部分,以及您指定的任何其他插入惠呼。對(duì)于視圖層次結(jié)構(gòu)中的其他視圖导俘,安全區(qū)域僅反映該視圖中被遮蔽的部分。例如剔蹋,如果視圖完全位于其視圖控制器根視圖的安全區(qū)域內(nèi)旅薄,則此屬性中的邊緣插入為0。
根據(jù)Apple泣崩,Xcode 9 - 發(fā)行說明
Interface Builder使用UIView.safeAreaLayoutGuide作為UIViewController中不推薦的Top和Bottom布局指南的替代品少梁。要使用新的安全區(qū)域,請(qǐng)?jiān)谝晥D控制器的文件檢查器中選擇安全區(qū)域布局指南矫付,然后在內(nèi)容和新的安全區(qū)域錨點(diǎn)之間添加約束凯沪。這可以防止您的內(nèi)容被頂部和底部欄以及tvOS上的過掃描區(qū)域所掩蓋。部署到早期版本的iOS時(shí)买优,安全區(qū)域的約束將轉(zhuǎn)換為頂部和底部妨马。
以下是示例代碼: 如果您在代碼中創(chuàng)建約束挺举,請(qǐng)使用UIView的safeAreaLayoutGuide屬性來獲取相關(guān)的布局錨點(diǎn)。讓我們?cè)诖a中重新創(chuàng)建上面的Interface Builder示例烘跺,看看它的外觀:
假設(shè)我們?cè)谝晥D控制器中有綠色視圖作為屬性:
private let greenView = UIView()
我們可能有一個(gè)功能來設(shè)置從viewDidLoad調(diào)用的視圖和約束:
private func setupView() {
greenView.translatesAutoresizingMaskIntoConstraints = false
greenView.backgroundColor = .green
view.addSubview(greenView)
}
始終使用根視圖的layoutMarginsGuide創(chuàng)建前導(dǎo)和尾隨邊距約束:
let margins = view.layoutMarginsGuide
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
])
現(xiàn)在湘纵,除非您僅定位到iOS 11,否則您需要將#available的安全區(qū)域布局指南約束包裝起來液荸,并回到早期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)
])
}
蘋果官網(wǎng)文檔:https://developer.apple.com/documentation/uikit/uiview/2891102-safearealayoutguide