適配iOS11&iPhoneX的一些坑

博客傳送門(mén)
前陣子項(xiàng)目開(kāi)發(fā)忙成狗,就一直沒(méi)做iOS11的適配,直到XcodeGM版發(fā)布后衫哥,我胸有成竹的在iPhoneX上跑起項(xiàng)目,整個(gè)人都涼透了...下面總結(jié)一下我遇到的坑悲关,不是很全面谎僻,日后補(bǔ)充。

導(dǎo)航欄

導(dǎo)航欄高度的變化

iOS11之前導(dǎo)航欄默認(rèn)高度為64pt(這里高度指statusBar + NavigationBar)寓辱,iOS11之后如果設(shè)置了prefersLargeTitles = YES則為96pt艘绍,默認(rèn)情況下還是64pt,但在iPhoneX上由于劉海的出現(xiàn)statusBar由以前的20pt變成了44pt秫筏,所以iPhoneX上高度變?yōu)?8pt诱鞠,如果項(xiàng)目里隱藏了導(dǎo)航欄加了自定義按鈕之類(lèi)的,這里需要注意適配一下这敬。

導(dǎo)航欄圖層及對(duì)titleView布局的影響

iOS11之前導(dǎo)航欄的title是添加在UINavigationItemView上面航夺,而navigationBarButton則直接添加在UINavigationBar上面,如果設(shè)置了titleView崔涂,則titleView也是直接添加在UINavigationBar上面阳掐。iOS11之后,大概因?yàn)?code>largeTitle的原因冷蚂,視圖層級(jí)發(fā)生了變化缭保,如果沒(méi)有給titleView賦值,則titleView會(huì)直接添加在_UINavigationBarContentView上面蝙茶,如果賦值了titleView艺骂,則會(huì)把titleView添加在_UITAMICAdaptorView上,而navigationBarButton被加在了_UIButtonBarStackView上尸闸,然后他們都被加在了_UINavigationBarContentView上彻亲,如圖:

圖1

所以如果你的項(xiàng)目是自定義的navigationBar,那么在iOS11上運(yùn)行就可能出現(xiàn)布局錯(cuò)亂的bug吮廉,解決辦法是重寫(xiě)UINavigationBarlayoutSubviews方法苞尝,調(diào)整布局,上代碼:

- (void)layoutSubviews {
    [super layoutSubviews];
    
    //注意導(dǎo)航欄及狀態(tài)欄高度適配
    self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), naviBarHeight);
    for (UIView *view in self.subviews) {
        if([NSStringFromClass([view class]) containsString:@"Background"]) {
            view.frame = self.bounds;
        }
        else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
            CGRect frame = view.frame;
            frame.origin.y = statusBarHeight;
            frame.size.height = self.bounds.size.height - frame.origin.y;
            view.frame = frame;
        }
    }
}

再補(bǔ)充一點(diǎn)宦芦,看了簡(jiǎn)書(shū)App適配iOS11發(fā)現(xiàn)titleView支持autolayout宙址,這要求titleView必須是能夠自撐開(kāi)的或?qū)崿F(xiàn)了- intrinsicContentSize方法

- (CGSize)intrinsicContentSize {
    return UILayoutFittingExpandedSize;
}

繼承自UIScrollView的視圖偏移問(wèn)題

大家在iOS11設(shè)備上運(yùn)行出現(xiàn)最多問(wèn)題應(yīng)該就是tableview莫名奇妙的偏移20pt或者64pt了。调卑。原因是iOS11棄用了automaticallyAdjustsScrollViewInsets屬性抡砂,取而代之的是UIScrollView新增了contentInsetAdjustmentBehavior屬性,這一切的罪魁禍?zhǔn)锥际切乱氲?code>safeArea恬涧,關(guān)于safeArea適配這篇文章iOS 11 安全區(qū)域適配總結(jié)講的很詳細(xì)注益,感興趣的可以看下,我直接貼適配代碼溯捆,因?yàn)榈桶姹局苯佑?code>contentInsetAdjustmentBehavior會(huì)報(bào)警告丑搔,所有定義了如下的宏(感謝@炒雞范的指正,之前的宏犯了個(gè)低級(jí)錯(cuò)誤...現(xiàn)改為)

#define  adjustsScrollViewInsets(scrollView)\
do {\
_Pragma("clang diagnostic push")\
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"")\
if ([scrollView respondsToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
    NSMethodSignature *signature = [UIScrollView instanceMethodSignatureForSelector:@selector(setContentInsetAdjustmentBehavior:)];\
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];\
    NSInteger argument = 2;\
    invocation.target = scrollView;\
    invocation.selector = @selector(setContentInsetAdjustmentBehavior:);\
    [invocation setArgument:&argument atIndex:2];\
    [invocation retainArguments];\
    [invocation invoke];\
}\
_Pragma("clang diagnostic pop")\
} while (0)

還有的發(fā)現(xiàn)某些界面tableViewsectionHeadersectionFooter高度與設(shè)置不符的問(wèn)題啤月,在iOS11中如果不實(shí)現(xiàn) -tableView: viewForHeaderInSection:-tableView: viewForFooterInSection: 煮仇,則-tableView: heightForHeaderInSection:- tableView: heightForFooterInSection:不會(huì)被調(diào)用,導(dǎo)致它們都變成了默認(rèn)高度谎仲,這是因?yàn)?code>tableView在iOS11默認(rèn)使用Self-Sizing浙垫,tableViewestimatedRowHeightestimatedSectionHeaderHeight郑诺、 estimatedSectionFooterHeight三個(gè)高度估算屬性由默認(rèn)的0變成了UITableViewAutomaticDimension夹姥,解決辦法簡(jiǎn)單粗暴,就是在對(duì)應(yīng)界面實(shí)現(xiàn)對(duì)應(yīng)方法或把tableView的這三個(gè)屬性設(shè)為0间景。如果你想全局關(guān)閉Self-Sizing可使用下面這段代碼:

   UITableView.appearance.estimatedRowHeight = 0; 
   UITableView.appearance.estimatedSectionFooterHeight = 0;
   UITableView.appearance.estimatedSectionHeaderHeight = 0;

如果你使用了Masonry佃声,某些界面需要適配需要適配safeArea,請(qǐng)更新到最新版本倘要,可以試試下面這段代碼

    if (@available(iOS 11.0, *)) {
        make.edges.equalTo(self.view.mas_safeArea);
    } else {
        make.edges.equalTo(self.view);
    }

相冊(cè)訪問(wèn)權(quán)限

看其他適配文章上對(duì)iOS11相冊(cè)權(quán)限調(diào)整的說(shuō)明是“iOS11把 NSPhotoLibraryUsageDescription 替換成了NSPhotoLibraryAddUsageDescription”圾亏,奇怪的是我的項(xiàng)目并沒(méi)有添加NSPhotoLibraryAddUsageDescription,在訪問(wèn)相冊(cè)時(shí)也沒(méi)發(fā)生crash封拧,后來(lái)在仔細(xì)閱讀了官方文檔才發(fā)現(xiàn)NSPhotoLibraryAddUsageDescription只針對(duì)相冊(cè)存儲(chǔ)權(quán)限志鹃,在iOS11上系統(tǒng)默認(rèn)打開(kāi)了用戶(hù)相冊(cè)的訪問(wèn)權(quán)限,如果應(yīng)用需要存儲(chǔ)權(quán)限就需要添加這個(gè)key泽西,否則就會(huì)crash曹铃。

AppIcon

在iOS11上發(fā)現(xiàn)了一個(gè)奇怪的現(xiàn)象,APP在啟動(dòng)時(shí)圖標(biāo)會(huì)出現(xiàn)黑邊捧杉,如圖(處女座實(shí)在忍不了...)

圖2

原因是iOS11修改了App啟動(dòng)動(dòng)畫(huà)陕见,如果你的App圖標(biāo)有圓角那么就會(huì)變成這個(gè)鳥(niǎo)樣了...所有圖標(biāo)都換成直角就好了,具體規(guī)范見(jiàn)Human Interface Guidelines-App Icon味抖,還是要聽(tīng)蘋(píng)果爸爸的話(huà)啊...

iPhoneX

LaunchImage

關(guān)于iPhoneX(我就不吐槽劉海了...)评甜,如果你的APP在iPhoneX上運(yùn)行發(fā)現(xiàn)沒(méi)有充滿(mǎn)屏幕,上下有黑色區(qū)域仔涩,那么你應(yīng)該也像我一樣LaunchImage沒(méi)有用storyboard而是用的Assets忍坷,解決辦法如圖,啟動(dòng)圖的尺寸為1125x2436熔脂,or you can iOS開(kāi)發(fā)時(shí)如何使用 Launch Screen Storyboard佩研。

圖3

TabBarController

如果你使用了原生tabBar,系統(tǒng)會(huì)自動(dòng)適配霞揉,因?yàn)槲覀兊捻?xiàng)目用了第三方的TabBarController旬薯,在iPhoneX運(yùn)行,tabBar看起來(lái)怪怪的(如果不確定你的項(xiàng)目tabBar在iPhoneX上看起來(lái)是否正常适秩,可以參照模擬器的照片APP袍暴,一看便知)...估計(jì)作者要等到猴年馬月才適配iPhoneX些侍,項(xiàng)目又著急上線(xiàn),就自己改了下政模,主要是tabBar高度及tabBarItem偏移適配,iPhoneX由于底部安全區(qū)的原因UITabBar高度由49pt變成了83pt蚂会,多出來(lái)的34pt是空白手勢(shì)區(qū)域淋样。可以通過(guò)判斷機(jī)型來(lái)修改相關(guān)界面代碼胁住,方式有兩種趁猴,通過(guò)分辨率判斷:

#define kDevice_Is_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)

通過(guò)設(shè)備名稱(chēng)判斷:
@"iPhone10,1" : @"iPhone 8",
@"iPhone10,4" : @"iPhone 8",
@"iPhone10,2" : @"iPhone 8 Plus",
@"iPhone10,5" : @"iPhone 8 Plus",
@"iPhone10,3" : @"iPhone X",
@"iPhone10,6" : @"iPhone X",
這里推薦使用UIDeviceIdentifier

目前遇到的就這些坑彪见,歡迎大家指正補(bǔ)充~

作為一名iOS開(kāi)發(fā)人員儡司,想到當(dāng)年嘲笑Android開(kāi)發(fā)蛋疼的適配各種機(jī)型心情如圖...

圖4

后來(lái)發(fā)現(xiàn)原因是項(xiàng)目的APP圖標(biāo)有圓角,因?yàn)閕OS11修改了啟動(dòng)動(dòng)畫(huà)余指,導(dǎo)致這一問(wèn)題直接暴露了...關(guān)于AppIcon規(guī)范詳見(jiàn)[Human Interface Guidelines

iOS-App Icon](https://developer.apple.com/ios/human-interface-guidelines/icons-and-images/app-icon/)

最后奉上WWDC官方視頻:

Updating Your App for iOS 11

Building Apps for iPhone X

Designing for iPhone X

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捕犬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酵镜,更是在濱河造成了極大的恐慌碉碉,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淮韭,死亡現(xiàn)場(chǎng)離奇詭異垢粮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)靠粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)蜡吧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人占键,你說(shuō)我怎么就攤上這事昔善。” “怎么了捞慌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵耀鸦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我啸澡,道長(zhǎng)袖订,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任嗅虏,我火速辦了婚禮洛姑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皮服。我一直安慰自己楞艾,他們只是感情好参咙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著硫眯,像睡著了一般蕴侧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上两入,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天净宵,我揣著相機(jī)與錄音,去河邊找鬼裹纳。 笑死择葡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剃氧。 我是一名探鬼主播敏储,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼朋鞍!你這毒婦竟也來(lái)了已添?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤番舆,失蹤者是張志新(化名)和其女友劉穎酝碳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恨狈,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疏哗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了禾怠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片返奉。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吗氏,靈堂內(nèi)的尸體忽然破棺而出芽偏,到底是詐尸還是另有隱情,我是刑警寧澤弦讽,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布污尉,位于F島的核電站,受9級(jí)特大地震影響往产,放射性物質(zhì)發(fā)生泄漏被碗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一仿村、第九天 我趴在偏房一處隱蔽的房頂上張望锐朴。 院中可真熱鬧,春花似錦蔼囊、人聲如沸焚志。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酱酬。三九已至壶谒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膳沽,已是汗流浹背佃迄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贵少,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓堆缘,卻偏偏與公主長(zhǎng)得像滔灶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吼肥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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