一、iPhoneX適配第一步,根據iPhoneX的屏幕像素大小,引入對應的啟動圖,告訴系統,app兼容iPhoneX
需要在launchimage中引入一張 1125*2436的png,app將默認展示支持iPhoneX的效果
二、安全區域的概念
所謂的安全區域是一個虛擬出來的概念,因為iPhoneX獨特的劉海,所以划定一個矩形的區域,在這個區域之內展示的內容不會被彎曲的屏幕切割,因此叫做安全區
安全區怎么定義?
每個viewcontroller對應一個view,view中的屬性描述上面紅色區域的距離
@property (nonatomic,readonly) UIEdgeInsets safeAreaInsets API_AVAILABLE(ios(11.0),tvos(11.0));
默認情況下面,在規則的屏幕比如iphone8,iphone8+ 上面, safeAreaInsets 中四個邊距是0;如果是iPhoneX上面,蘋果系統會自動給safeAreaInsets指定一些值,比如頂部距離64
怎么使用safeAreaInsets?
為了不要讓view中的元素被遮擋,你需要動態調整view中元素的位置,比如下面的代碼,
CGFloat xOffset = 0.0; if (@available(iOS 11.0, *)) { xOffset = self.view.safeAreaInsets.left; }
self.resourceAllocView.left = xOffset + self.resourceAllocView.left; self.liveDataView.left = xOffset + self.liveDataView.left; self.splitView.left = xOffset + self.splitView.left; self.labelTitle.left = xOffset + self.labelTitle.left; _imageViewReturn.left = xOffset + _imageViewReturn.left;
如果你使用的是autolayout
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) ]) }
三、何時使用
當安全區邊距變化之后,系統會在方法通知你
- (void)viewSafeAreaInsetsDidChange
這個方法存在於ViewController和View之中,你可以在這里對元素位置做出修正
四、Home鍵指示器
- (BOOL)prefersHomeIndicatorAutoHidden
{
return YES;
}
如果你需要隱藏Home鍵可以通過上面的方法
五、總結
蘋果發展到現在,可以發現每個版本中都會新增一些界面布局的API和廢棄一些API,這個讓開發者增加了很多成本
autolayout布局的方式蘋果也沒有放棄,甚至用的更多。frame布局越來越不好用,看來要用autolayout才能擁抱未來了
希望蘋果在排版上多多學習Android的xml布局方式,更容易理解和靈活
六、參考
iPhone X適配集合
https://github.com/2877025939/iOS11