iOS 11 適配看這篇還不夠?

weixin_34107955發表於2017-09-20

導航

iOS 11 中導航主要問題是,使自定義返回按鈕點選區域變小了,導致使用者體驗很不好。主要有兩種方法:

  • 方法一:使用 Frame 佈局
    iOS 11 以前,imageView 的 Frame 可以是 CGRectZero,這樣它的點選區域也很大,而 iOS 11 必須設定一個 Frame。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 80, 30)];
imageView.userInteractionEnabled = YES;
imageView.contentMode = UIViewContentModeLeft;
imageView.image = image;
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:imageView];
  • 方法二: 使用自動佈局,當然這種方式 iOS8 以上才行,
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
imageView.userInteractionEnabled = YES;
imageView.contentMode = UIViewContentModeLeft;
imageView.image = image;
if ([imageView respondsToSelector:@selector(widthAnchor)]) {
    NSLayoutConstraint *widthConstraint = [imageView.widthAnchor constraintEqualToConstant:80];
    // Swift widthConstraint.isActive = YES;
    widthConstraint.active = YES;
}
    
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:imageView];

瞭解更多

automaticallyAdjustsScrollViewInsets 屬性

iOS 11 後 UIViewController 的屬性 automaticallyAdjustsScrollViewInsets,變為了 UIScrollView's contentInsetAdjustmentBehavior。如果發現介面無意中位置偏移了,很可能是這個屬性導致的。


if (@available(iOS 11.0, *)) {
   self.collectionView.contentInsetAdjustmentBehavior =UIScrollViewContentInsetAdjustmentNever;
} else {
   self.automaticallyAdjustsScrollViewInsets = NO;
}

MJRefresh 出現的問題,看這個

applicationDidEnterBackground 不執行

APP 進入後臺後,applicationDidEnterBackground: 這個方法將延遲大約 1000 毫秒執行, 那麼如果在進入後臺時做一些任務,可能會達不到預期的效果。如果 APP 剛進入應用立即啟動,applicationDidEnterBackground: 和 applicationWillEnterForeground: 這兩個方法都不會呼叫。如果有這麼一個場景,進入後臺後給應用設定手勢密碼,當 APP 剛進入後就立即啟動,那麼 applicationDidEnterBackground:這個方法不會立即執行,從而手勢密碼也就不會設定。

裝置名稱

如果你的專案中有有關裝置名的顯示,比如 來自 iPhone X,那麼你需要適配下新裝置:

@"iPhone10,1" : @"iPhone 8",
@"iPhone10,4" : @"iPhone 8",
@"iPhone10,2" : @"iPhone 8 Plus",
@"iPhone10,5" : @"iPhone 8 Plus",
@"iPhone10,3" : @"iPhone X",
@"iPhone10,6" : @"iPhone X",

當然這些值可以 看這裡
推薦一個 第三方庫

UIImagePickerController 設定導航背景圖

[self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navBg"] forBarMetrics:UIBarMetricsDefault];

這樣設定發現對 UIImagePickerController 不起作用,需要使用:

self.navigationBar.barTintColor = [UIColor blackColor];

WebViewJavascriptBridge crash

如何你專案中使用 WebViewJavascriptBridge 與 H5 互動,那麼這裡有一個 crash。

解決方法

提交 AppStore

提交 AppStore 時需要 1024*1024 Logo,別好不容易打包好了,發現還需要一個 Logo,重新打包有點不值的。

1664496-f421da5d300965c0.png
appStore.png

iPhone X

  • iPhone X 的狀態列由原來的 20 變為了 44。這個如果在導航的位置設定自定義的 View,在 iPhone X 上出問題。會擋住 View 的顯示。
1664496-81b380a37e28997a.png
statusbar.png
[UIApplication sharedApplication].statusBarFrame

{{0, 0}, {375, 44}}
  • 啟動頁,如果使用 LaunchScreen.storyboard 作為啟動頁,需要調整下 Top 的約束,以前為 -20 ,改為 -44 ;
1664496-d4b398eab07c2bf6.png
LaunchScreen.png

如果不是採用 LaunchScreen.storyboard 這種方式作為啟動頁,可以 看這篇

  • 關於距離狀態列的高度在 iPhone X 有可能被擋住,需要留意一下;

更多

螢幕尺寸變化

  • {375, 812} iPhone X
  • {375, 667} iPhone 8 / iPhone 7 / iPhone 6
  • {414, 736} iPhone 8P / iPhone 7P / iPhone 6P
  • {320, 568} iPhone SE / iPhone 5

參考

bugly

===== 我是有底線的 ======
喜歡我的文章,歡迎關注我的新浪微博 Lefe_x,我會不定期的分享一些開發技巧

1664496-e409f16579811101.jpg

相關文章