iPhone X的適配相信大家都已經(jīng)做了,而由于代碼風(fēng)格的迥異,適配方案也是很多。今天小編就根據(jù)經(jīng)驗(yàn)來做一個(gè)總結(jié),列舉出一個(gè)最優(yōu)雅的方法來。
什么是最優(yōu)雅的適配方法?。看鸢福?b>蘋果系統(tǒng)提供的方法就是最優(yōu)雅的。廢話不多說,直接上干貨。
先來說說iPhone X與之前所有手機(jī)的不同之處。以下是小編列出來的iPhone X與其余手機(jī)的比較:
1>iPhone X 的默認(rèn)系統(tǒng)是 iOS 11.0 以上,不存在11.0以前的系統(tǒng)。
2>iPhone X 的 statusBar 與 tabbar 的默認(rèn)高度與之前的手機(jī)不一樣,其中 stabusBar 的高度由之前的20.0變成44.0,tabbar 的高度從之前的49.0變成88.0。
這兩點(diǎn)就是iPhone X與其余手機(jī)的區(qū)別。既然區(qū)別已經(jīng)知道了,那就根據(jù)這兩點(diǎn)來做適配,錯了,是優(yōu)雅的適配。
iPhone X 的默認(rèn)系統(tǒng)是 iOS 11.0以上,那么根據(jù)iPhone X的適配更多是適配iOS 11.0
?不少老程序員應(yīng)該都經(jīng)歷過從iOS6到iOS7過渡的那段恐怖的時(shí)期,除了風(fēng)格從擬物化到平面化的過渡,更重要的是UIViewController的view的坐標(biāo)系改變了,為此,蘋果增加了一個(gè)新的方法automaticallyAdjustsScrollViewInsets,這是解決iOS系統(tǒng)從6到7因?yàn)樽鴺?biāo)系改變做適配的最優(yōu)雅的方法。

不過,automaticallyAdjustsScrollViewInsets并不是要說的重點(diǎn),因?yàn)閍utomaticallyAdjustsScrollViewInsets已經(jīng)在iOS11.0廢棄了,所以在適配iOS11.0以及iPhone X的時(shí)候這個(gè)方法用不到,不是重點(diǎn),關(guān)鍵是接下來的方法。
重點(diǎn)來了:
在automaticallyAdjustsScrollViewInsets出來的同時(shí),iOS還提供了另外兩個(gè)適配方法那就是UIViewController的topLayoutGuide以及bottomLayoutGuide,只是使用這個(gè)方法的前提是摒棄frame的概念,而是用約束layout的思想。
詳細(xì)情況需要讀者們?nèi)ラ喿x官方文檔,接下來我將簡單列舉兩個(gè)例子來說明topLayoutGuide以及bottomLayoutGuide的使用。

運(yùn)行以上的代碼塊實(shí)現(xiàn)的效果如下:

現(xiàn)象解析:當(dāng)前代碼的架構(gòu)是window的rootViewController是一個(gè)UITabbarController,UITabbarController控制一個(gè)UINavigationController,UINavigationController控制圖中的綠色的UIViewController。這個(gè)樣子的話,綠色背景的UIViewController的frame.origin是從UINavigationBar所覆蓋的下面,也就是屏幕的左上角。同樣,屏幕的高度也就是屏幕的高度。所以像代碼塊1那些寫的話自然就會出現(xiàn)代碼塊1運(yùn)行效果。
可是像代碼塊1運(yùn)行效果的的UI是不會獲得任何產(chǎn)品以及用戶的喜歡的,一般情況下是如下效果:

如果這個(gè)樣子的話,那么就會有很多人說:好辦,直接讓約束的offset設(shè)為64.0或者49.0就可以了。我只能說這樣寫太low了,如果出現(xiàn)像iPhone X這樣在尺寸上大改變的話,難道在再重新適配?放心,蘋果自然給出了最優(yōu)雅的解決方案,那就是使用上面所說的topLayoutGuide以及bottomLayoutGuide,代碼塊如下:

Masnory里面的源碼如下:


不過值得注意的是automaticallyAdjustsScrollViewInsets以及topLayoutGuide與bottomLayoutGuide在iOS11.0已摒棄,因此這種情況只適用范圍的集合是[iOS7.0——iOS11.0),不過在iOS11.0以后使用好像也沒事,但是保險(xiǎn)起見,還是使用iOS11.0提供了更好可替代的方法,那就是:
1.iOS11.0以前的UIViewController的automaticallyAdjustsScrollViewInsets替換成UIScrollView的contentInsetAdjustmentBehavior
2.iOS11.0以前的topLayoutGuide與bottomLayoutGuide替換成UIView的safeAreaLayoutGuide,
UIScrollView的contentInsetAdjustmentBehavior跟UIViewController的automaticallyAdjustsScrollViewInsets相對來說比較簡單,不提,只需要簡單看一下官方文檔就可以使用了,關(guān)鍵是看UIView的safeAreaLayoutGuide,這個(gè)等同于上文提到的topLayoutGuide與bottomLayoutGuide。

廢話不多說,如果在iOS11.0以后實(shí)現(xiàn)產(chǎn)品只需要做如下更改就可以了:

圖9的代碼塊實(shí)現(xiàn)了iOS11.0之后以及之前的適配,運(yùn)行效果跟圖4一模一樣。
那么圖9的代碼運(yùn)行在iPhone X上是什么效果呢?如圖10:

從圖10的運(yùn)行效果來看:使用了UIView的safeAreaLayoutGuide的方法不僅完全是賠了iOS11.0還完美適配了iPhone X,所以在小編看來只需要使用iOS11.0以后提供的UIView的safeAreaLayoutGuide方法就解決了iPhone X的絕大部分適配。這是小編認(rèn)為適配iPhone X最優(yōu)雅的解決辦法。
題外話:怎么才算是最優(yōu)雅的解決辦法呢?蘋果推薦的方案就是最優(yōu)雅的,同意的點(diǎn)贊與關(guān)注。記?。簩懘a要優(yōu)雅,不要污。