轉自:http://www.code4app.com/blog-822717-1471.html
關於iPhone X的適配,主要需要做的工作點就是針對上下非安全區域的適配。
在iOS開發中,針對於布局存在 xib 與 代碼編輯 兩種方式。而這兩種方式又都支援 絕對布局 與 AutoLayout 兩種。
接下來本文將從xib、代碼編輯、絕對布局、Autolayout幾個布局方式來講解如何針對iPhone X做自動化適配
Xib布局
Xib的絕對布局並不靈活,如果想要通過特有因素更改View的Frame則需要通過屬性索引來實現。所以這裡只針對Xib的AutoLayout來做講解
首先XCode9的Xib為我們提供了SafeAreaLayout選項,而這個選項並不支援iOS9以前的版本。
SafeAreaLayout
那麼我們需要針對靠近底部或者頂部非安全區域的View做約束就可以達到理想效果,然而約束的值卻不能固定,你還需要兼顧非iPhone X的機型。
那麼你可以從以下幾點中找到解決方案:
首先我們的布局檔案如下:
三個相同的Label位於控制器根View的底部
約束檔案
首先,如果你是做一個新的頁面,那麼在設定約束時,添加Constrain to margins屬性會幫你大忙,布局檔案中的第二個Label就是使用Margin屬性進行布局。
Constrain to margins
首先,如果你有一個已經存在的頁面,而且已經設定好了約束的布局,那麼你可以找到對應的約束屬性,勾選它的Relative to margin選項,將此約束屬性以指向相對於marigin。
雙擊它 (╯>д<)╯⁽˙³˙⁾
約束屬性 Relative to margin入口
勾選它 (╯>д<)╯⁽˙³˙⁾
Relative to margin
接下來我們可以看到這三種布局產生的效果
你可以通過布局視圖左下角的View as: (某某機型) ,選擇iPhone X機型來快速查看布局應用結果。
布局效果
以及啟動並執行效果
運行效果
可以看到,基礎約束並不會對iPhone X底部的非安全區域進行適配,而Constrain to margins 與Relative to margin作用下的約束,則可以完美的適應iPhone X。
使用代碼布局
代碼布局依然可以通AutoLayout進行布局,同時也可以通過分支判斷來進行絕對布局。
AutoLayout
1.如果你需要使用原生的API來進行AutoLayout布局,那麼你可以使用NSLayoutAttributeBottomMargin作為Bottom的約束枚舉值
| 1 2 |
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.leftLabel >attribute:NSLayoutAttributeBottomMargin relatedBy:NSLayoutRelationEqual toItem:self.rightLabel >attribute:NSLayoutAttributeBottom multiplier: 1 constant: 0 ]; [self.view addConstraint:constraint]; |
2.如果你的Autolayout是通過Masonry進行編輯的,那麼你只需要更改底部約束
在更早的Masonry版本中
由: