9.18更新:經(jīng)測試發(fā)現(xiàn)ios12修改了非劉海屏safearea的值! 拿iphone6豎屏情況下為例ios11中返回的safeareainsets為(0,0,0,0);ios12中返回的safeareainsets為(20,0,0,0);是的這個top-20是狀態(tài)欄。這里大家要注意下,不應(yīng)該盲目使用safeareainsets,而是使用我下面類似的判斷劉海屏的方法來區(qū)分劉海屏后再決定是否使用safeareainsets;
今年的三款新手機已經(jīng)發(fā)布,加上xcode10已經(jīng)發(fā)布gm seed版本,也可以使用模擬器對新機進行適配,所以趕緊開始吧!
三款手機的屏幕大小
上面是像素單位,然后我們找到對應(yīng)的倍數(shù),換算成-點pt;
最后得到:
iphone xs 375812pt*
iphone xr 414896pt*
iphone x 414896pt*
總結(jié)一下,因為x已經(jīng)都是陪過了xs基本上就是忽略不管了,而新出的xr和xs max雖然屏幕像素不同(一個lcd屏幕一個oled屏幕)所以一個2x一個3x最終得到的pt大小是一樣的(這里可以看出蘋果果然沒白給你便宜)。加上ios11開始引入了safeareainsets,如果之前使用了這個屬性,我們幾乎不需要對項目中的頁面做調(diào)整,那么最后只剩下一部要做 添加兩個尺寸的啟動圖。
添加啟動圖
為什么要添加啟動圖?
當(dāng)我們在xr的模擬器直接跑之前的老項目(已經(jīng)適配過iphonex),做如下打印,你會發(fā)現(xiàn):
wtf?難道是xcode10的bug?再試試xs max我相信你會得到一樣的結(jié)果。
這里解釋下。你是否還記得iphonex剛出來的時候跑沒有適配過的項目,會導(dǎo)致app打開屏幕上下各有幾十像素的黑屏?原因是因為沒有假如iphonex的啟動頁!同理我們需要先引入啟動頁。
這是啟動圖尺寸,直接照著像素單位切圖即可。
需要注意的是,當(dāng)你的老項目用xcode10打開后,打開images.xcassets文件夾,再到launchimage文件夾下時,找不到以上兩個新機型的占位框,最簡單的辦法就是右鍵添加一個新的launchimage,然后刪除老的launchimage,記得新建的文件夾要改名launchimage哦。
新建的launchimage會出現(xiàn)兩個新機型的占位框:
啟動頁添之后,再做打印,就會的到正確的屏幕尺寸了!
頁面適配
由于從ios11開始引入了safeareainsets這個應(yīng)該是老話題了,所以這里稍微提供下我自己的心得吧。
頁面是陪經(jīng)常要寫個中判斷,代碼中時常需要用到safeareainsets或者判斷劉海屏等工具,所以我習(xí)慣在項目中寫一個uimanager的單例,這里面除了提供一些適配需要的屬性,還可以寫一下tableview適配等。
1
2
3
4
5
6
7
8
9
10
11
|
@interface dduimanager : nsobject @property (nonatomic, assign, readonly) uiedgeinsets safeareainset; /* * 是否是劉海屏 * */ @property (nonatomic, assign, readonly) bool ishairhead; + (instancetype)sharedmanager; @end |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@implementation dduimanager - (uiwindow *)keywindow { return [uiapplication sharedapplication].keywindow; } - (uiedgeinsets)safeareainset { if (@available(ios 11.0, *)) { if (self.keywindow) { return self.keywindow.safeareainsets; } } return uiedgeinsetszero; } - ( bool )ishairhead { if (uiinterfaceorientationislandscape([uiapplication sharedapplication].statusbarorientation)) { return self.safeareainset.left > 0.0f; } else { // ios12 非劉海屏狀態(tài)欄 20.0f return self.safeareainset.top > 20.0f; } } @end |
這樣寫除了使用方便以外,還避免了一部分關(guān)于系統(tǒng)的條件編譯等,因為safeareainset是ios11才出的.而且在e lse中會返回uiedgeinsetszero,使得使用時可以省去一些if-else語句,例如:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://www.jianshu.com/p/703b86c9108a