【整理】ios11適配 以及會有的坑 持續更新。。。

一、iPhone X尺寸問題html

分辨率1125*2436  (375*812)ios

導航欄爲 44+44  原來爲20+44git

底部tabbar  49+34  其他屏幕 49+0github

 

二、打印線程問題xcode

Main Thread Checker: UI API called on a background thread: -[UIApplication statusBarOrientation]
PID: 49130, TID: 336237, Thread name: (none), Queue name: WriteLogQueue, QoS: 0緩存

形成緣由是由於本來 須要在主線程執行的代碼 被放在了子線程裏邊安全

解決方法:在scheme 裏邊取消主線程檢測 (以下圖   不建議使用) 或者修改代碼 把出問題的代碼放在主線程裏邊便可 我這裏目前發現了shareSDK 內部有狀態欄設置在子線程 出現打印問題app

 

3 、automaticallyAdjustsScrollViewInsets 在ios11 系統下須要使用contentInsetAdjustmentBehavior 代替 不然會出現問題 須要注意iphone

UIScrollViewContentInsetAdjustmentBehavior 是一個枚舉類型,值有如下幾種:佈局

  • -automatic 和scrollableAxes同樣,scrollView會自動計算和適應頂部和底部的內邊距而且在scrollView 不可滾動時,也會設置內邊距.

  • -scrollableAxes 自動計算內邊距.

  • -never不計算內邊距

  • -always 根據safeAreaInsets 計算內邊距

很顯然,咱們這裏要設置爲 never

 

四、判斷ios11 系統的宏這樣寫 判斷時候就不會報警告

#define IOS11 @available(iOS 11.0, *)

//下邊的這種寫法會報警高很煩

#define IOS11 ([[UIDevice currentDevice].systemVersion intValue] >= 11 ? YES : NO)

//判斷是iPhoneX 的宏

#define is_iPhoneX [UIScreen mainScreen].bounds.size.width == 375.0f && [UIScreen mainScreen].bounds.size.height == 812.0f

if (IOS11) {
        [self.myScrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentAutomatic];
    } else {
        // Fallback on earlier versions
         self.automaticallyAdjustsScrollViewInsets = YES;
    }

 

五、在iPhone X 裏邊在隱藏 導航欄時候   導航欄上邊  24 的白邊 以下圖

解決方法

1>最簡單最粗暴就是每一個頁面都拉線從新約束 判斷是不是iphoneX 更換約束

2>通過查資料 發如今ios11 以後引入了安全域的概念 (安全域的概念自行查文檔或者google)

因此就有了如下方法

從新設置tableView/scrollView的contentInset值,來抵消掉SafeAreaInset值,

由於內容下移偏移量 = contentInset + SafeAreaInset;

SafeAreaInset 是隻讀屬性 沒法修改因此能夠經過修改contentInset 來重設 安全域的大小

 

固然這個屬性仍是須要的 設置爲never 時候 安全域默認從nav下邊計算。

在沒有nav 狀況下 安全域從  狀態欄下邊開始計算

tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

而後若是是iPhone X 的狀況下 設置

scrollView.contentInset = UIEdgeInsetsMake(-44, 0, 0, 0);(我項目由於要取消狀態欄影響 因此約束設置的爲-20  因此這裏的安全區域偏移 更改成-24 便可  根據本身實際狀況設置)

而後設置

self.tableView.clipsToBounds =NO;(不設置的話 若是設置的是透明導航 會出現被遮擋的狀況)

以上代碼便可解決透明導航  在iPhone X 出現白色狀態欄遮擋的問題

 

六、navigationbar上設置searchbar爲titleView,發現導航變高了。。。而後返回到上個界面,UI佈局就變了

解決方法:

將searchbar 放入一個view 裏邊使用view 來限制searchbar 的大小  而後再把view 給navigationbar的titleView

七、ios11默認是開啓Self-Sizing,

若是目前項目中沒有使用estimateRowHeight屬性,tableView是使用estimateRowHeight屬性的,這樣就會形成contentSize和contentOffset值的變化,

若是是有動畫是觀察這兩個屬性的變化進行的,就會形成動畫的異常,由於在估算行高機制下,contentSize的值是一點點地變化更新的,全部cell顯示完後纔是最終的contentSize值。由於不會緩存正確的行高,tableView reloadData的時候,會從新計算contentSize,就有可能會引發contentOffset的變化。

iOS11下不想使用Self-Sizing的話,能夠經過如下方式關閉:
            tableView.estimatedRowHeight = 0
            tableView.estimatedSectionFooterHeight = 0
            tableView.estimatedSectionHeaderHeight = 0      

  iOS11下,若是沒有設置estimateRowHeight的值,也沒有設置rowHeight的值,那contentSize計算初始值是 44 * cell的個數,以下圖:

八、對於大量頁面須要設置 contentInsetAdjustmentBehavior屬性 僅需在appdelegate 裏邊設置就可 全局適配

 

 

9.Xcode9下相冊等訪問權限問題

以前項目中相機功能一直使用系統自帶的PickerView,說實話不甚美觀,本身空閒之餘一直着手開發自定義相機(EVNCamera:給個StarO(∩_∩)O~)。在Xcode9的首個Beta版本中開發相機功能時發現,原有項目居然crash,
後來發現iOS11下,蘋果對相冊的權限key作了調整,原來
若是將圖片保存到系統相冊,iOS11以後,新增NSPhotoLibraryAddUsageDescription(Xcode9如下打包APP不須要考慮這些),須要在本身的plist文件中添加這個權限配置。

10 NFC權限

在iOS11中,蘋果開放了NFC(Near field communication),怕也是其推廣ApplePay的一種策略。
在使用近場通信時,首先也要在info.plist配置NFCReaderUsageDescription 權限,案例步驟,以下:


 

號外:xcode9 的一些問題能夠參考這個帖子

安全區域相關:http://www.jianshu.com/p/efbc8619d56b

ios11 xcode9 相關:http://www.jianshu.com/p/9c145e25c339

相關文章
相關標籤/搜索