ios 適配iOS11&iPhoneX的一些坑
前陣子專案開發忙成狗,就一直沒做iOS11的適配,直到XcodeGM版釋出後,我胸有成竹的在iPhoneX上跑起專案,整個人都涼透了...下面總結一下我遇到的坑,不是很全面,日後補充。
導航欄
導航欄高度的變化
iOS11之前導航欄預設高度為64pt(這裡高度指statusBar + NavigationBar),iOS11之後如果設定了prefersLargeTitles = YES則為96pt,預設情況下還是64pt,但在iPhoneX上由於劉海的出現statusBar由以前的20pt變成了44pt,所以iPhoneX上高度變為88pt,如果專案裡隱藏了導航欄加了自定義按鈕之類的,這裡需要注意適配一下。
導航欄圖層及對titleView佈局的影響
iOS11之前導航欄的title是新增在UINavigationItemView上面,而navigationBarButton則直接新增在UINavigationBar上面,如果設定了titleView,則titleView也是直接新增在UINavigationBar上面。iOS11之後,大概因為largeTitle的原因,檢視層級發生了變化,如果沒有給titleView賦值,則titleView會直接新增在_UINavigationBarContentView上面,如果賦值了titleView,則會把titleView新增在_UITAMICAdaptorView上,而navigationBarButton被加在了_UIButtonBarStackView上,然後他們都被加在了_UINavigationBarContentView上,如圖:
所以如果你的專案是自定義的navigationBar,那麼在iOS11上執行就可能出現佈局錯亂的bug,解決辦法是重寫UINavigationBar的layoutSubviews方法,調整佈局,上程式碼:
- (void)layoutSubviews { [super layoutSubviews]; //注意導航欄及狀態列高度適配 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; } } }
再補充一點,看了簡書App適配iOS11發現titleView支援autolayout,這要求titleView必須是能夠自撐開的或實現了- intrinsicContentSize方法
- (CGSize)intrinsicContentSize { return UILayoutFittingExpandedSize; }
UIScrollView、UITableView、UICollectionView
大家在iOS11裝置上執行出現最多問題應該就是tableview莫名奇妙的偏移20pt或者64pt了。。原因是iOS11棄用了automaticallyAdjustsScrollViewInsets屬性,取而代之的是UIScrollView新增了contentInsetAdjustmentBehavior屬性,這一切的罪魁禍首都是新引入的safeArea,關於safeArea適配這篇文章iOS 11 安全區域適配總結講的很詳細,感興趣的可以看下,我直接貼適配程式碼,因為低版本直接用contentInsetAdjustmentBehavior會報警告,所有定義瞭如下的巨集(感謝@炒雞範的指正,之前的巨集犯了個低階錯誤...現改為)
#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)
還有的發現某些介面tableView的sectionHeader、sectionFooter高度與設定不符的問題,在iOS11中如果不實現 -tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection: ,則-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不會被呼叫,導致它們都變成了預設高度,這是因為tableView在iOS11預設使用Self-Sizing,tableView的estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight三個高度估算屬性由預設的0變成了UITableViewAutomaticDimension,解決辦法簡單粗暴,就是實現對應方法或把這三個屬性設為0。
如果你使用了Masonry,那麼你需要適配safeArea
if (@available(iOS 11.0, *)) { make.edges.equalTo()(self.view.safeAreaInsets) } else { make.edges.equalTo()(self.view) }
iPhoneX
LaunchImage
關於iPhoneX(我就不吐槽劉海了...),如果你的APP在iPhoneX上執行發現沒有充滿螢幕,上下有黑色區域,那麼你應該也像我一樣LaunchImage沒有用storyboard而是用的Assets,解決辦法如圖,啟動圖的尺寸為1125x2436,or you can iOS開發時如何使用 Launch Screen Storyboard。
TabBarController
因為我們的專案用了第三方的TabBarController,在iPhoneX執行,tabBar看起來怪怪的...估計作者要等到猴年馬月才適配iPhoneX,專案又著急上線,就自己修改了第三方,主要是tabBar高度及tabBarItem偏移適配,iPhoneX由於底部安全區的原因UITabBar高度由49pt變成了83pt,可以通過判斷機型來修改相關介面程式碼
#define kDevice_Is_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
目前遇到的就這些坑,歡迎大家指正補充~
作為一名iOS開發人員,想到當年嘲笑Android開發蛋疼的適配各種機型心情如圖...
相關推薦
ios 適配iOS11&iPhoneX的一些坑
前陣子專案開發忙成狗,就一直沒做iOS11的適配,直到XcodeGM版釋出後,我胸有成竹的在iPhoneX上跑起專案,整個人都涼透了...下面總結一下我遇到的坑,不是很全面,日後補充。 導航欄 導航欄高度的變化 iOS11之前導航欄預設高度為64pt(這裡高度指statusBar + NavigationBa
iOS開發之適配iOS11&iPhoneX的一些坑
導航欄 導航欄高度的變化 iOS11之前導航欄預設高度為64pt(這裡高度指statusBar + NavigationBar),iOS11之後如果設定了prefersLargeTitles = YES則為96pt,預設情況下還是64pt,但在iP
適配iOS11&iPhoneX的一些坑
下面從幾個方面講解iOS11的特性,和iPhone X的那些事 螢幕 我們在編碼中使用的是以point為單位的螢幕尺寸(在不同裝置上每個point對應的實際畫素點是不一樣的),iPhone 8的尺寸是375pt × 667pt @2x,iPhone X的尺寸是37
iOS 適配 iOS11,會引起呼叫系統相簿、分享郵件的系統介面上移問題
適配 iOS11,避免滾動檢視頂部出現20的空白,全域性設定了UIScrollView。 if (@available(iOS 11.0, *)) { [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollView
Android PopupWindow 7.0適配遇到的一些坑
PopupWindow在使用showAsDropDown的時候,在7.0以後不能正常顯示;解決方法網上貼出來很多,最多的就是重寫showAsDropDown,計算一下高度@Override public void showAsDropDown(View anchor) {
iOS之旅--iOS11的一些適配工作
跳轉App Store評論 - (void)gotoAppStoreEvaluate { //1028355284是我們APP的appID,替換成你的應用的appID即可 NSStri
<iOS螢幕適配> iPhoneX SafeArea - 安全區域
一. 前言 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "PingFang SC"; color: #000000 } span.s1 { } span.s2 { font: 13.0px "Helvetica Neue" } 本文的出發點是對
<iOS屏幕適配> iPhoneX SafeArea - 安全區域
sub 分享 ace 了解 ati 屏幕寬度 tool 圖的創建 結果 一. 前言 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "PingFang SC"; color: #000000 } span.s1 {
iOS 整理iOS9適配中出現的坑
轉載 http://www.cocoachina.com/ios/20151016/13715.html =================================================== 作者:董鉑然 授權本站轉載。 本文主要是說一些iOS9適
iOS 採用@available(iOS 11.0, *)適配 iOS11,會引起呼叫系統相簿時,系統介面上移問題
我們在使用以下方法適配 iOS11,避免滾動檢視頂部出現20的空白以及push或者pop的時候頁面有一個上移或者下移的異常動畫的問題時,會導致一個問題,就是當我們的應用呼叫系統相簿時,引起系統相簿介面整體上移。原因是因為:全域性設定瞭如下的方法。 if (@a
整理 iOS 9 適配中出現的坑(圖文)
宣告:本文轉載自http://www.cocoachina.com/ios/20151016/13715.html 本文主要是說一些iOS9適配中出現的坑,如果只是要單純的瞭解iOS9新特性可以看瞄神的開發者所需要知道的 iOS 9 SDK 新特性。9月17日凌晨,蘋果
iOS 適配iOS9
allow 退回 log sub logs 分享 授權 版本 網絡 1、網絡接口不支持https協議,在iOS9下 在iOS9下,系統默認會攔截對http協議接口的訪問,因此無法獲取http協議接口的數據。 解決方案(以下方法2選1): (1)暫時退回到http協議 具
為App適配iOS11
btn get eth rdl contain tag :after roo clas .markdown-body hr::after,.markdown-body::after { clear: both } .loopLine,.messageLine0 { } .m
適配ios11與iphone x實踐
swe bridge policy target sed table 模擬器 req 降級 一、適配iOS11 問題1:項目中有原生與H5的交互,運行在iOS11時,直接漰潰在框架WebViewJavascriptBridge內部。 報錯信息:Completion hand
iOS 後臺掛起的一些坑
遠程服務 為我 top 暫停 word ucc 資源 isp 沒有 特別說明: 後臺狀態:當前app如果不是作為屏幕中的第一層,呈現顯示給用戶,那麽此時app就是後臺狀態。 鎖屏(包括:當前應用下鎖屏、其他應用下鎖屏、桌面鎖屏) 用戶在使用其他應用app2,當
iOS----------適配iOS12
文件 共存 con ica code form ios1 sim 使用 library not found for -lstdc++.6.0.9 原因是蘋果在XCode10和iOS12中移除了libstdc++這個庫,由libc++這個庫取而代之,蘋果的解釋是libstdc
PhaserJS 3 螢幕適配時的小坑 -- JavaScript Html5 遊戲開發
PhaserJS 巨坑:在config內不要把 width 設為 window.innnerWidth在config內不要把 width 設為 window.innnerWidth在config內不要把 width 設為 window.i
iOS 適配iPhone XR/XS/XS MAX
適配只看三個引數 1.渲染畫素--螢幕截圖的圖片尺寸,單位px 2.邏輯畫素--程式設計師開發所用尺寸,單位pt 3.倍率--渲染畫素/邏輯畫素,得到倍數關係。常見倍率@2x,@3x Safe Area(安全區) 1.頁面內容不能超出安全區(Safe Area) 2
貓貓分享 iOS 適配iPhoneXS Max,iPhoneXS,iPhoneXR
怎麼適配xsm xr呢, 如果你適配了x那麼很簡單 如果你用了巨集像這樣: #define IPHONEX ( ( ([[UIScreen mainScreen] nativeBounds].size.height == 2436) || ([[UIScreen
iOS 適配iPhone XR/iPhone XS Max
快速適配先說結論,找設計師要2張啟動圖: iPhone XR:828px x 1792px iPhone XS Max: 1242px x 2688px 程式碼中使用了螢幕size判斷是否是iPhone X的需要修改,請翻到最後。 LaunchImage中只