適配iPhoneXS max和iPhoneX R的方法示例
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)欄。這里大家要注意下,不應該盲目使用safeAreaInsets,而是使用我下面類似的判斷劉海屏的方法來區(qū)分劉海屏后再決定是否使用safeAreaInsets;
今年的三款新手機已經(jīng)發(fā)布,加上Xcode10已經(jīng)發(fā)布GM Seed版本,也可以使用模擬器對新機進行適配,所以趕緊開始吧!
三款手機的屏幕大小

上面是像素單位,然后我們找到對應的倍數(shù),換算成-點pt;

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

WTF?難道是Xcode10的bug?再試試XS Max我相信你會得到一樣的結果。
這里解釋下。你是否還記得iPhoneX剛出來的時候跑沒有適配過的項目,會導致app打開屏幕上下各有幾十像素的黑屏?原因是因為沒有假如iPhoneX的啟動頁!同理我們需要先引入啟動頁。

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

新建的LaunchImage會出現(xiàn)兩個新機型的占位框:

啟動頁添之后,再做打印,就會的到正確的屏幕尺寸了!

頁面適配
由于從iOS11開始引入了safeAreaInsets這個應該是老話題了,所以這里稍微提供下我自己的心得吧。
頁面是陪經(jīng)常要寫個中判斷,代碼中時常需要用到safeAreaInsets或者判斷劉海屏等工具,所以我習慣在項目中寫一個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
這樣寫除了使用方便以外,還避免了一部分關于系統(tǒng)的條件編譯等,因為safeAreaInset是iOS11才出的.而且在e lse中會返回UIEdgeInsetsZero,使得使用時可以省去一些if-else語句,例如:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
iOS微信瀏覽器回退不刷新實例(監(jiān)聽瀏覽器回退事件)
下面小編就為大家?guī)硪黄猧OS微信瀏覽器回退不刷新實例(監(jiān)聽瀏覽器回退事件)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
IOS內(nèi)存泄漏檢查方法及重寫MLeakFinder
這篇文章主要介紹了IOS內(nèi)存泄漏檢查方法及如何重寫MLeakFinder,幫助ios開發(fā)者維護自身程序,感興趣的朋友可以了解下2021-04-04
iOS動畫解析之圓球加載動畫XLBallLoading的實現(xiàn)
加載動畫對大家來說都不陌生,我們在平時都會遇見,開發(fā)中也必不可少,所以下面這篇文章主要給大家介紹了關于iOS動畫解析之圓球加載動畫XLBallLoading實現(xiàn)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11
iOS多線程應用開發(fā)中自定義NSOperation類的實例解析
這篇文章主要介紹了iOS多線程應用開發(fā)中自定義NSOperation類的實例解析,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01

