適配iPhoneXS max和iPhoneX R的方法示例
9.18更新:經(jīng)測(cè)試發(fā)現(xiàn)iOS12修改了非劉海屏safeArea的值! 拿iPhone6豎屏情況下為例iOS11中返回的safeAreaInsets為(0,0,0,0);iOS12中返回的safeAreaInsets為(20,0,0,0);是的這個(gè)top-20是狀態(tài)欄。這里大家要注意下,不應(yīng)該盲目使用safeAreaInsets,而是使用我下面類似的判斷劉海屏的方法來(lái)區(qū)分劉海屏后再?zèng)Q定是否使用safeAreaInsets;
今年的三款新手機(jī)已經(jīng)發(fā)布,加上Xcode10已經(jīng)發(fā)布GM Seed版本,也可以使用模擬器對(duì)新機(jī)進(jìn)行適配,所以趕緊開始吧!
三款手機(jī)的屏幕大小

上面是像素單位,然后我們找到對(duì)應(yīng)的倍數(shù),換算成-點(diǎn)pt;

最后得到:
iPhone XS 375812pt*
iPhone XR 414896pt*
iPhone X 414896pt*
總結(jié)一下,因?yàn)閄已經(jīng)都是陪過(guò)了XS基本上就是忽略不管了,而新出的XR和XS Max雖然屏幕像素不同(一個(gè)LCD屏幕一個(gè)OLED屏幕)所以一個(gè)2x一個(gè)3x最終得到的pt大小是一樣的(這里可以看出蘋果果然沒(méi)白給你便宜)。加上iOS11開始引入了safeAreaInsets,如果之前使用了這個(gè)屬性,我們幾乎不需要對(duì)項(xiàng)目中的頁(yè)面做調(diào)整,那么最后只剩下一部要做 添加兩個(gè)尺寸的啟動(dòng)圖。
添加啟動(dòng)圖
為什么要添加啟動(dòng)圖?
當(dāng)我們?cè)赬R的模擬器直接跑之前的老項(xiàng)目(已經(jīng)適配過(guò)iPhoneX),做如下打印,你會(huì)發(fā)現(xiàn):

WTF?難道是Xcode10的bug?再試試XS Max我相信你會(huì)得到一樣的結(jié)果。
這里解釋下。你是否還記得iPhoneX剛出來(lái)的時(shí)候跑沒(méi)有適配過(guò)的項(xiàng)目,會(huì)導(dǎo)致app打開屏幕上下各有幾十像素的黑屏?原因是因?yàn)闆](méi)有假如iPhoneX的啟動(dòng)頁(yè)!同理我們需要先引入啟動(dòng)頁(yè)。

這是啟動(dòng)圖尺寸,直接照著像素單位切圖即可。
需要注意的是,當(dāng)你的老項(xiàng)目用Xcode10打開后,打開Images.xcassets文件夾,再到LaunchImage文件夾下時(shí),找不到以上兩個(gè)新機(jī)型的占位框,最簡(jiǎn)單的辦法就是右鍵添加一個(gè)新的LaunchImage,然后刪除老的LaunchImage,記得新建的文件夾要改名LaunchImage哦。

新建的LaunchImage會(huì)出現(xiàn)兩個(gè)新機(jī)型的占位框:

啟動(dòng)頁(yè)添之后,再做打印,就會(huì)的到正確的屏幕尺寸了!

頁(yè)面適配
由于從iOS11開始引入了safeAreaInsets這個(gè)應(yīng)該是老話題了,所以這里稍微提供下我自己的心得吧。
頁(yè)面是陪經(jīng)常要寫個(gè)中判斷,代碼中時(shí)常需要用到safeAreaInsets或者判斷劉海屏等工具,所以我習(xí)慣在項(xiàng)目中寫一個(gè)UIManager的單例,這里面除了提供一些適配需要的屬性,還可以寫一下tableView適配等。
@interface DDUIManager : NSObject @property (nonatomic, assign, readonly) UIEdgeInsets safeAreaInset; /* * 是否是劉海屏 * */ @property (nonatomic, assign, readonly) BOOL isHairHead; + (instancetype)sharedManager; @end
@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)的條件編譯等,因?yàn)閟afeAreaInset是iOS11才出的.而且在e lse中會(huì)返回UIEdgeInsetsZero,使得使用時(shí)可以省去一些if-else語(yǔ)句,例如:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS MRC 下 block 循環(huán)引用問(wèn)題實(shí)例講解
本文通過(guò)文字說(shuō)明加代碼的形式給大家介紹了iOS MRC 下 block 循環(huán)引用問(wèn)題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-12-12
Swift 進(jìn)階 —— map 和 flatMap的使用
這篇文章主要介紹了Swift map和flatMap的相關(guān)資料,幫助大家更好的理解和使用Swift,感興趣的朋友可以了解下2020-09-09
實(shí)例講解iOS音樂(lè)播放器DOUAudioStreamer用法
本篇文章給大家通過(guò)實(shí)例講解了iOS音樂(lè)播放器DOUAudioStreamer用法以及分享了實(shí)例代碼,一起學(xué)習(xí)參考下吧。2017-12-12
ios7中UIViewControllerBasedStatusBarAppearance作用詳解
這篇文章主要介紹了 ios7中UIViewControllerBasedStatusBarAppearance作用詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11
IOS實(shí)現(xiàn)圖片輪播無(wú)限循環(huán)效果
這篇文章主要為大家詳細(xì)介紹了IOS實(shí)現(xiàn)圖片輪播無(wú)限循環(huán)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
IOS開發(fā)Objective-C?Runtime使用示例詳解
這篇文章主要為大家介紹了IOS開發(fā)Objective-C?Runtime使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

