長話短說:iOS11和iPhone X發(fā)布幌氮,雖然iPhone X很丑,很失望胁澳,但是iOS 11很致命该互,讓我們的APP又得重新適配一下,很蛋疼也很惡心韭畸!
這是Xcode9變化官方文檔:developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcode/xcode_9/xcode_9.html
這是蘋果的官方指導文檔給我們來做適配:developer.apple.com/ios/human-interface-guidelines/overview/themes/
就目前來看宇智,發(fā)現(xiàn)兩個地方需要我們?nèi)ミm配:
一:iPhone X的適配
虛線是安全區(qū)域!說白了胰丁,背景必須是全屏随橘!然后視圖,頂部減去44锦庸,下部減去44机蔗,中間就是安全區(qū)域了。也就是屏幕四角的半徑為44甘萧,這個在橫屏或者豎屏下萝嘁,導航條和TabBar避開這個44就可以了!
底部千萬別添加什么手勢扬卷,而阻擋了系統(tǒng)的手勢酿愧。UIScreenEdgePanGestureRecognizer這個類是設置屏幕邊緣手勢的!需要在邊緣使用手勢的就用這個類邀泉。
二:iOS 11的適配
iOS11目前就發(fā)現(xiàn)了一個問題,UItableveView的組間距問題:之前的設置不管用了,小調(diào)一下汇恤,這樣解決:
必須添加這個兩個屬性E痈帧!因谎!否則代理設置的高度無效基括,沒有效果!
_accountTableView.sectionHeaderHeight = 0;
_accountTableView.sectionFooterHeight = 8;
然后再用代理里面的方法設置組間距财岔,想要自定義风皿,就在代理進行分別設置!
導航欄
導航欄高度的變化
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上鼎兽,如圖:
再補充一點答姥,看了簡書App適配iOS11 發(fā)現(xiàn)titleView支持autolayout,這要求titleView必須是能夠自撐開的或?qū)崿F(xiàn)了- intrinsicContentSize方法
-?(CGSize)intrinsicContentSize?{
returnUILayoutFittingExpandedSize;
}
UIScrollView谚咬、UITableView鹦付、UICollectionView
大家在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?=?[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)某些界面tableView的sectionHeader杠茬、sectionFooter高度與設置不符的問題月褥,在iOS11中如果不實現(xiàn) -tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection: ,則-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不會被調(diào)用瓢喉,導致它們都變成了默認高度宁赤,這是因為tableView在iOS11默認使用Self-Sizing,tableView的estimatedRowHeight栓票、estimatedSectionHeaderHeight决左、 estimatedSectionFooterHeight三個高度估算屬性由默認的0變成了UITableViewAutomaticDimension,解決辦法簡單粗暴逗载,就是實現(xiàn)對應方法或把這三個屬性設為0哆窿。
如果你使用了Masonry,那么你需要適配safeArea
if(@available(iOS11.0,?*))?{
make.edges.equalTo()(self.view.safeAreaInsets)
}else{
make.edges.equalTo()(self.view)
}
PhoneX
LaunchImage
關于iPhoneX(我就不吐槽劉海了...)厉斟,如果你的APP在iPhoneX上運行發(fā)現(xiàn)沒有充滿屏幕挚躯,上下有黑色區(qū)域,那么你應該也像我一樣LaunchImage沒有用storyboard而是用的Assets擦秽,解決辦法如圖码荔,啟動圖的尺寸為1125x2436漩勤,or you caniOS開發(fā)時如何使用 Launch Screen Storyboard
TabBarController
因為我們的項目用了第三方的TabBarController,在iPhoneX運行缩搅,tabBar看起來怪怪的...估計作者要等到猴年馬月才適配iPhoneX越败,項目又著急上線,就自己修改了第三方硼瓣,主要是tabBar高度及tabBarItem偏移適配究飞,iPhoneX由于底部安全區(qū)的原因UITabBar高度由49pt變成了83pt,可以通過判斷機型來修改相關界面代碼
1#define?kDevice_Is_iPhoneX?([UIScreen?instancesRespondToSelector:@selector(currentMode)]???CGSizeEqualToSize(CGSizeMake(1125,2436),?[[UIScreen?mainScreen]?currentMode].size)?:?NO)
目前遇到的就這些坑堂鲤,歡迎大家指正補充~