iOS11 適配 遇到的坑 APPIcon lanuch 問題

前陣子項目開發(fā)忙成狗推姻,就一直沒做iOS11的適配拧廊,直到XcodeGM版發(fā)布后,我胸有成竹的在iPhoneX上跑起項目啄清,整個人都涼透了...下面總結一下我遇到的坑六水,不是很全面,日后補充盒延。

導航欄

導航欄高度的變化

iOS11之前導航欄默認高度為64pt(這里高度指statusBar + NavigationBar)缩擂,iOS11之后如果設置了prefersLargeTitles = YES則為96pt鼠冕,默認情況下還是64pt添寺,但在iPhoneX上由于劉海的出現(xiàn)statusBar由以前的20pt變成了44pt,所以iPhoneX上高度變?yōu)?8pt懈费,如果項目里隱藏了導航欄加了自定義按鈕之類的计露,這里需要注意適配一下。

導航欄圖層及對titleView布局的影響

iOS11之前導航欄的title是添加在UINavigationItemView上面憎乙,而navigationBarButton則直接添加在UINavigationBar上面票罐,如果設置了titleView,則titleView也是直接添加在UINavigationBar上面泞边。iOS11之后该押,大概因為largeTitle的原因,視圖層級發(fā)生了變化阵谚,如果沒有給titleView賦值蚕礼,則titleView會直接添加在_UINavigationBarContentView上面,如果賦值了titleView梢什,則會把titleView添加在_UITAMICAdaptorView上奠蹬,而navigationBarButton被加在了_UIButtonBarStackView上,然后他們都被加在了_UINavigationBarContentView上嗡午,如圖:

圖1

所以如果你的項目是自定義的navigationBar囤躁,那么在iOS11上運行就可能出現(xiàn)布局錯亂的bug,解決辦法是重寫UINavigationBar的layoutSubviews方法荔睹,調整布局狸演,上代碼:

- (void)layoutSubviews {? ? [superlayoutSubviews];//注意導航欄及狀態(tài)欄高度適配self.frame =CGRectMake(0,0,CGRectGetWidth(self.frame), naviBarHeight);for(UIView*viewinself.subviews) {if([NSStringFromClass([viewclass]) containsString:@"Background"]) {? ? ? ? ? ? view.frame =self.bounds;? ? ? ? }elseif([NSStringFromClass([viewclass]) containsString:@"ContentView"]) {CGRectframe = view.frame;? ? ? ? ? ? frame.origin.y = statusBarHeight;? ? ? ? ? ? frame.size.height =self.bounds.size.height - frame.origin.y;? ? ? ? ? ? view.frame = frame;? ? ? ? }? ? }}

再補充一點,看了簡書App適配iOS11發(fā)現(xiàn)titleView支持autolayout僻他,這要求titleView必須是能夠自撐開的或實現(xiàn)了- intrinsicContentSize方法

- (CGSize)intrinsicContentSize {returnUILayoutFittingExpandedSize;}

繼承自UIScrollView的視圖偏移問題

大家在iOS11設備上運行出現(xiàn)最多問題應該就是tableview莫名奇妙的偏移20pt或者64pt了宵距。。原因是iOS11棄用了automaticallyAdjustsScrollViewInsets屬性中姜,取而代之的是UIScrollView新增了contentInsetAdjustmentBehavior屬性消玄,這一切的罪魁禍首都是新引入的safeArea跟伏,關于safeArea適配這篇文章iOS 11 安全區(qū)域適配總結講的很詳細,感興趣的可以看下翩瓜,我直接貼適配代碼受扳,因為低版本直接用contentInsetAdjustmentBehavior會報警告,所有定義了如下的宏(感謝@炒雞范的指正兔跌,之前的宏犯了個低級錯誤...現(xiàn)改為)

#define? adjustsScrollViewInsets(scrollView)\do{\_Pragma("clang diagnostic push")\_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"")\if([scrollView respondsToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\NSMethodSignature*signature = [UIScrollViewinstanceMethodSignatureForSelector:@selector(setContentInsetAdjustmentBehavior:)];\NSInvocation*invocation = [NSInvocationinvocationWithMethodSignature:signature];\NSIntegerargument =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)某些界面tableView的sectionHeader勘高、sectionFooter高度與設置不符的問題,在iOS11中如果不實現(xiàn)-tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection:坟桅,則-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不會被調用华望,導致它們都變成了默認高度,這是因為tableView在iOS11默認使用Self-Sizing仅乓,tableView的estimatedRowHeight赖舟、estimatedSectionHeaderHeight、estimatedSectionFooterHeight三個高度估算屬性由默認的0變成了UITableViewAutomaticDimension夸楣,解決辦法簡單粗暴宾抓,就是在對應界面實現(xiàn)對應方法或把tableView的這三個屬性設為0。如果你想全局關閉Self-Sizing可使用下面這段代碼:

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

如果你使用了Masonry豫喧,某些界面需要適配需要適配safeArea石洗,請更新到最新版本,可以試試下面這段代碼

if(@available(iOS11.0, *)) {? ? ? ? make.edges.equalTo(self.view.mas_safeArea);? ? }else{? ? ? ? make.edges.equalTo(self.view);? ? }

相冊訪問權限

看其他適配文章上對iOS11相冊權限調整的說明是“iOS11把NSPhotoLibraryUsageDescription替換成了NSPhotoLibraryAddUsageDescription”紧显,奇怪的是我的項目并沒有添加NSPhotoLibraryAddUsageDescription讲衫,在訪問相冊時也沒發(fā)生crash,后來在仔細閱讀了官方文檔才發(fā)現(xiàn)NSPhotoLibraryAddUsageDescription只針對相冊存儲權限孵班,在iOS11上系統(tǒng)默認打開了用戶相冊的訪問權限涉兽,如果應用需要存儲權限就需要添加這個key,否則就會crash重父。

AppIcon

在iOS11上發(fā)現(xiàn)了一個奇怪的現(xiàn)象花椭,APP在啟動時圖標會出現(xiàn)黑邊,如圖(處女座實在忍不了...)

圖2

原因是iOS11修改了App啟動動畫房午,如果你的App圖標有圓角那么就會變成這個鳥樣了...所有圖標都換成直角就好了矿辽,具體規(guī)范見Human Interface Guidelines-App Icon,還是要聽蘋果爸爸的話啊...

iPhoneX

LaunchImage

關于iPhoneX(我就不吐槽劉海了...)郭厌,如果你的APP在iPhoneX上運行發(fā)現(xiàn)沒有充滿屏幕袋倔,上下有黑色區(qū)域,那么你應該也像我一樣LaunchImage沒有用storyboard而是用的Assets折柠,解決辦法如圖宾娜,啟動圖的尺寸為1125x2436,or you caniOS開發(fā)時如何使用 Launch Screen Storyboard扇售。

圖3

TabBarController

如果你使用了原生tabBar前塔,系統(tǒng)會自動適配嚣艇,因為我們的項目用了第三方的TabBarController,在iPhoneX運行华弓,tabBar看起來怪怪的(如果不確定你的項目tabBar在iPhoneX上看起來是否正常食零,可以參照模擬器的照片APP,一看便知)...估計作者要等到猴年馬月才適配iPhoneX寂屏,項目又著急上線贰谣,就自己改了下,主要是tabBar高度及tabBarItem偏移適配迁霎,iPhoneX由于底部安全區(qū)的原因UITabBar高度由49pt變成了83pt吱抚,多出來的34pt是空白手勢區(qū)域】剂可以通過判斷機型來修改相關界面代碼秘豹,方式有兩種,通過分辨率判斷:

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

通過設備名稱判斷:

@"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芝此。

目前遇到的就這些坑憋肖,歡迎大家指正補充~

作為一名iOS開發(fā)人員因痛,想到當年嘲笑Android開發(fā)蛋疼的適配各種機型心情如圖...

圖4

后來發(fā)現(xiàn)原因是項目的APP圖標有圓角婚苹,因為iOS11修改了啟動動畫,導致這一問題直接暴露了...關于AppIcon規(guī)范詳見[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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鸵膏,一起剝皮案震驚了整個濱河市膊升,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谭企,老刑警劉巖廓译,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異债查,居然都是意外死亡非区,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門盹廷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來征绸,“玉大人,你說我怎么就攤上這事俄占」艿。” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵缸榄,是天一觀的道長渤弛。 經常有香客問我,道長甚带,這世上最難降的妖魔是什么她肯? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任佳头,我火速辦了婚禮,結果婚禮上晴氨,老公的妹妹穿的比我還像新娘畜晰。我一直安慰自己,他們只是感情好瑞筐,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布凄鼻。 她就那樣靜靜地躺著,像睡著了一般聚假。 火紅的嫁衣襯著肌膚如雪块蚌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天膘格,我揣著相機與錄音峭范,去河邊找鬼。 笑死瘪贱,一個胖子當著我的面吹牛纱控,可吹牛的內容都是我干的。 我是一名探鬼主播菜秦,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼甜害,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了球昨?” 一聲冷哼從身側響起尔店,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎主慰,沒想到半個月后嚣州,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡共螺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年该肴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藐不。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡匀哄,死狀恐怖,靈堂內的尸體忽然破棺而出佳吞,到底是詐尸還是另有隱情拱雏,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布底扳,位于F島的核電站铸抑,受9級特大地震影響,放射性物質發(fā)生泄漏衷模。R本人自食惡果不足惜鹊汛,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一蒲赂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刁憋,春花似錦滥嘴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尘颓,卻和暖如春走触,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疤苹。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工互广, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卧土。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓惫皱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尤莺。 傳聞我的和親對象是個殘疾皇子旅敷,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容