適配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,而是使用我下面類似的判斷劉海屏的方法來區(qū)分劉海屏后再?zèng)Q定是否使用safeAreaInsets;

今年的三款新手機(jī)已經(jīng)發(fā)布,加上Xcode10已經(jīng)發(fā)布GM Seed版本,也可以使用模擬器對(duì)新機(jī)進(jìn)行適配,所以趕緊開始吧!

三款手機(jī)的屏幕大小

image

圖片官網(wǎng)地址

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

image

圖片官網(wǎng)地址

最后得到:

iPhone XS 375 * 812pt

iPhone XR 414 * 896pt

iPhone Xs Max 414 * 896pt

總結(jié)一下,因?yàn)閄已經(jīng)都是陪過了XS基本上就是忽略不管了,而新出的XR和XS Max雖然屏幕像素不同(一個(gè)LCD屏幕一個(gè)OLED屏幕)所以一個(gè)2x一個(gè)3x最終得到的pt大小是一樣的(這里可以看出蘋果果然沒白給你便宜)。加上iOS11開始引入了safeAreaInsets,如果之前使用了這個(gè)屬性,我們幾乎不需要對(duì)項(xiàng)目中的頁面做調(diào)整,那么最后只剩下一部要做 添加兩個(gè)尺寸的啟動(dòng)圖

添加啟動(dòng)圖

為什么要添加啟動(dòng)圖?

當(dāng)我們?cè)赬R的模擬器直接跑之前的老項(xiàng)目(已經(jīng)適配過iPhoneX),做如下打印,你會(huì)發(fā)現(xiàn):

image

WTF?難道是Xcode10的bug?再試試XS Max我相信你會(huì)得到一樣的結(jié)果。

這里解釋下。你是否還記得iPhoneX剛出來的時(shí)候跑沒有適配過的項(xiàng)目,會(huì)導(dǎo)致app打開屏幕上下各有幾十像素的黑屏?原因是因?yàn)闆]有假如iPhoneX的啟動(dòng)頁!同理我們需要先引入啟動(dòng)頁。

image

圖片官網(wǎng)地址

這是啟動(dòng)圖尺寸,直接照著像素單位切圖即可。

需要注意的是,當(dāng)你的老項(xiàng)目用Xcode10打開后,打開Images.xcassets文件夾,再到LaunchImage文件夾下時(shí),找不到以上兩個(gè)新機(jī)型的占位框,最簡單的辦法就是右鍵添加一個(gè)新的LaunchImage,然后刪除老的LaunchImage,記得新建的文件夾要改名LaunchImage哦。

image

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

image

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


image

頁面適配

由于從iOS11開始引入了safeAreaInsets這個(gè)應(yīng)該是老話題了,所以這里稍微提供下我自己的心得吧。

頁面是陪經(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)?code>safeAreaInset是iOS11才出的.而且在e lse中會(huì)返回UIEdgeInsetsZero,使得使用時(shí)可以省去一些if-else語句,例如:

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 前言 蘋果WWDC開發(fā)者大會(huì)上,終于發(fā)布了大家期待已久的iOS 11,有些新特性功能確實(shí)出人意料。不過大的方面蘋果...
    Mr_Say_Yes閱讀 3,363評(píng)論 6 15
  • 隨著Xcode GM版本發(fā)布,適配iOS 11也就提上了日程,總的來說整個(gè)適配過程不是很麻煩。建議觀看今年WWDC...
    iOS駱駝閱讀 2,753評(píng)論 1 6
  • 一.iPhone X尺寸問題 1. 高度增加了145pt,變成812pt. 2.屏幕圓角顯示,注意至少留10pt邊...
    騎行天下閱讀 12,951評(píng)論 5 36
  • 一:iOS11 問題 有關(guān)iOS11 ,最大的變化就是增加了一個(gè)安全區(qū)域(safeArea)的概念,iOS11 適...
    蘇東沒有坡閱讀 50,822評(píng)論 25 67
  • iPhoneX適配 覺得不錯(cuò)請(qǐng)點(diǎn)擊下方【喜歡】,為了微博認(rèn)證也是無賴!還差1660個(gè)?? 屏幕尺寸相關(guān)變化 高度增加...
    樂Coding閱讀 18,076評(píng)論 8 50