1. 程式人生 > >ios 適配iOS11&iPhoneX的一些坑

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協議 具

為AppiOS11

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中只