適配ios11與iphone x實踐

1、適配 iOS11html

  問題1項目中有原生與 H5 的交互,運行在 iOS11 時,直接漰潰在框架 WebViewJavascriptBridge 內部ios

  報錯信息:Completion handler passed to -[WKWebViewJavascriptBridge webView:decidePolicyForNavigationAction:decisionHandler:] was called more than oncegit

  解決:當時第一時間確定是當即看 github 上該框架的 issue,果真找到了解決方案。該 issue 連接:https://github.com/marcuswestin/WebViewJavascriptBridge/issues/302,詳情以下圖github

  

 

  按照上述提供的解決方案修改就行了,下圖是修改前與修改後對比 ( 左圖修改前,右圖修改後 )web

            

 

 

  問題2:用戶首次安裝時, 定位權限框不彈出?app

  解決:原來在ios 11內權限的請求被降級了,由於以前工程內首次請求定位權限使用的方法爲 requestAlwaysAuthorization,在ios11內直接使用它請求定位無效,應該在info.plist增一個權限,以下:框架

  ps:  requestAlwaysAuthorization 方法是請求先後定位全部權限,由於 app 須要在後臺定位,因此使用的這個方法。若是 app 只要在使用期間定位,則應使用 requestWhenInUseAuthorization, 這個方法在 ios 11,能夠正常彈出定位請求框。iphone

 

  問題3:ios11中tableView分組間距變大。ide

  解決:原來組尾間距以前實現了 heightForFooterInSection,而沒有實現 viewForFooterInSection 方法,在 ios11 以前是沒問題,但如今就都要實現,若是不須要他們以前有間距須要這樣設置佈局

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.01;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    return nil;
}

 

  問題4:關於 tableView 或 scrollView 的在 ios11 中新增長的 contentInsetAdjustmentBehavior 屬性問題

  解決:看我上一篇博客 http://www.cnblogs.com/buerjj/p/7655090.html

 

  問題5:將第三方框架代碼拖入 Xcode 9 工程中,使用時報錯。例如:gitHub 下載最新的 masonry 源碼,將 masonry 文件拖入工程中,勾上 copy items if needed,選擇 create groups,勾上 Add to targets。使用 masonry 代碼以下

[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.mas_equalTo(self.view);
}];

  而後發現的 masonry 報錯以下: [UITableView mas_makeConstraints:]: unrecognized selector sent to instance 0x7f9c6f0b7200 

  緣由:Xcode 9 拖入第三方代碼不會將代碼放入工程編譯,拖入 masonry 文件夾後,點工程 - build phases - compile sources ,會發現這裏沒有 masonry 相關文件。

  解決1:點工程 - build phases - compile sources 點 + 號,將 masonry 加入編譯。

  解決2:不要使用拖入,應點擊工程,右鍵 Add Files To

  備註:這應該是 Xcode 9.0 bug,聽說9.1beta版已經修復。看此連接:http://blog.csdn.net/thoris/article/details/78139274?locationNum=7&fps=1

  ps: 最近作路徑規劃,在集成高德地圖時拖入第三方代碼時也是由於這個緣由報錯。使用一樣的方式均可以解決。親測。

 

 

2、適配 iPhone X

  問題1:在 iPhone x 模擬器上有 tabBar 時,push 頁面底部的 tabBar 會向上跳動一下,而後返回回來後又是 tabBar 又正常,再 push 又會跳動。

  解決:在攔截全部控制器push的地方加上以下代碼

    // 適配 iPhoneX
    CGRect frame = self.tabBarController.tabBar.frame;
    frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
    self.tabBarController.tabBar.frame = frame;

 

  問題2:導航欄高度問題;由於工程中沒有使用系統的導航欄,全是自定義的 view,因此在 iphone x上,導航欄高度仍是 64 顯然是不對的。

  解決:因此加入導航欄的宏定義,利用 [UIApplication sharedApplication].statusBarFrame.size.height + 44 就能夠動態獲得導航欄高度。其餘就不用修改了,只須要調整一下高度。還好以前導航欄自定義時內部的佈局封裝得比較好。

 

  問題3:底部tabBar變高。

  解決:由於使用的是系統tabBar,高度會自動適配,但 view 中有些佈局若是相對於原來 tabBar 寫死了 49 的高度的話,那就不行了,因此根據屏幕高度判斷是否爲 iPhone X,用宏定義寫 tabBar 的高度。這部分宏定義以下所示:

// 是不是iphoneX
#define     kIsIphoneX      ([UIScreen mainScreen].bounds.size.height == 812 ? YES : NO)

// tabbar高度
#define     kTabBarH        (kIsIphoneX ? 83 : 49)

   上面這種用宏定義來指定 tabBar 高度是當 tabBar 高度獲取不到狀況下使用它比較方便,由於有些狀況如當 app 啓動或者一些其餘時機 tabBar 尚未加載,當代碼中要使用這個高度就用上面方法獲取。若是當 tabBar 加載完成時,儘可能經過控制器層級關係去獲取 tabbar 的高度。好比下面這樣:

UITabBarController *tabbarController = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;
CGFloat tabbarH = tabbarController.tabBar.height;
相關文章
相關標籤/搜索