iOS11 與 iPhone X適配的那些坑(持更中...)

來源:互聯網
上載者:User

標籤:return   崩潰   type   cap   alert   width   href   home   cdb   

目錄 問題列表

1.XCode9添加資源檔不能擷取路徑問題

2.iOS11 系統導覽列上自訂view的顯示問題

3.UITableView 出現的遮擋顯示問題(三行代碼解決,放到基類)

4.適配iPhoneX 螢幕原則

5.適配過程一些常量的設定

6.出現UIScrollview 漂移問題(基本都是iPhoneX上)

7.iPhone X 上運行有黑色地區問題

8.有些導致iPhoneX擷取網路狀態崩潰的問題

9.一些關於iPhone X底部的設計示範

10.關於iPhoneX的home條(HomeIndicator)的顯隱

11.關於iOS11許可權的變化

12.iOS11 UICollectionview 的scroll indicator等被組視圖遮擋的問題

13.iOS11 無法彈出鍵盤問題

14.iOS11 數組文法糖??替換方法的改變

1. XCode9添加資源檔不能擷取路徑問題

XCode9調用[[NSBundle mainBundle] pathForResource:resourceNameofType:nil];方法來擷取檔案路徑,返回為nil. 添加正確方式如1,

 圖1  添加資源選項

但是XCode9 卻埋了一道坑,如2, 點擊資源檔,找到檔案選項

 圖2  資源檔選項

紅框地區未預設勾選, 只要把這個複選框勾選即可解決.  具體原因是:xcode9 添加檔案使用addfile 拖拽的檔案不會自動添加到Compile Sources 和 Copy Bundle Resources 下.

 

2. iOS11 系統導覽列上自訂view的顯示問題

之前代碼設定導覽列:

self.navigationItem.titleView = customView;

會出現這樣的問題,如3,

 圖3 導覽列出錯

 

介面出亂的原因是因為iOS11調整了導覽列圖層結構。快速簡便的修改方式,直接上代碼,

self.navigationItem.hidesBackButton = YES;
[self.navigationController.navigationBaraddSubview:YourCustomView];

但是需在控制器的dealloc裡移除你的自訂view,

[YourCustomView removeFromSuperview]; 

4為修改好的自訂視圖

 圖4

 

3. UITableView 出現的遮擋顯示問題(三行代碼解決,放到基類)
// iOS11適配
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
4. 適配iPhoneX 螢幕原則 圖5 iphoneX 豎屏 圖6 iPhoneX 橫屏  

設計原則:讓那行可操作、不可阻擋的控制項或視圖顯示在圖5、圖6的藍色地區(安全區域safeArea)。

頂部危險區距離:44

底部危險區距離:34

5. 適配過程一些常量的設定
#define YYISiPhoneX [[UIScreen mainScreen] bounds].size.width >=375.0f && [[UIScreen mainScreen] bounds].size.height >=812.0f&& YYIS_IPHONE
#define YYIS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
//狀態列高度
#define kStatusBarHeight    (CGFloat)(YYISiPhoneX?(44):(20))
// 導覽列高度
#define kNavBarHBelow7      (44)
// 狀態列和導覽列總高度
#define kNavBarHAbove7      (CGFloat)(YYISiPhoneX?(88):(64))
// TabBar高度
#define kTabBarHeight      (CGFloat)(YYISiPhoneX?(49+34):(49))
// 頂部安全區域遠離高度
#define kTopBarSafeHeight  (CGFloat)(YYISiPhoneX?(44):(0))
// 底部安全區域遠離高度
#define kBottomSafeHeight  (CGFloat)(YYISiPhoneX?(34):(0))
// iPhoneX的狀態列高度差值
#define kTopBarDifHeight    (CGFloat)(YYISiPhoneX?(24):(0))
6. 出現UIScrollview 漂移問題(基本都是iPhoneX上)

若是UIScrollview的frame和contentSize高度或者寬度一致卻還導致了漂移問題,可用以下一行代碼搞定。

if(@available(iOS11,*)) {_scrollView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;}

同時,如果在push進入webview頁面時,底部會有黑邊一閃而過,也可用此方法解決。

若嫌麻煩,每個scrollview及其子類都要去設定的話,也可以使用以下方法

// AppDelegate 裡進行全域設定 if(@available(iOS 11.0, *)){[[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
7. iPhone X 上運行有黑色地區問題

啟動圖問題,使用LaunchScreen來做啟動圖 或者 修改Assets中的LaunchImage,添加iPhoneX的Launch圖1125*2436(px) 豎屏模式。

8.有些導致iPhoneX擷取網路狀態崩潰的問題

直接上代碼,無需通過KVC得到圖層名擷取網路狀態,一勞永逸!(因還不熟悉markdown文法,以下代碼需自行縮排

#import <CoreTelephony/CTTelephonyNetworkInfo.h>
+ (NSString *)getNetWorkInfo {
    NSString *strNetworkInfo = @"No Network";
    struct sockaddr_storage zeroAddress;
    bzero(&zeroAddress,sizeof(zeroAddress));
    zeroAddress.ss_len = sizeof(zeroAddress);
    zeroAddress.ss_family = AF_INET;
// Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL,(struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
//獲得串連的標誌   
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability,&flags);
    CFRelease(defaultRouteReachability);
//如果不能擷取串連標誌,則不能串連網路,直接返回
    if(!didRetrieveFlags){ return strNetworkInfo;}     BOOL isReachable = ((flags & kSCNetworkFlagsReachable)!=0); BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired)!=0); if(!isReachable || needsConnection) {return strNetworkInfo;}// 網路類型判斷
    if((flags & kSCNetworkReachabilityFlagsConnectionRequired)== 0){strNetworkInfo = @"WIFI";}   
    if(((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0) { if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0){strNetworkInfo = @"WIFI";}}
    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) ==kSCNetworkReachabilityFlagsIsWWAN) {if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {CTTelephonyNetworkInfo * info = [[CTTelephonyNetworkInfo alloc] init];NSString *currentRadioAccessTechnology = info.currentRadioAccessTechnology;if (currentRadioAccessTechnology) {if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {strNetworkInfo =  @"4G";} else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnologyisEqualToString:CTRadioAccessTechnologyGPRS]) {strNetworkInfo =  @"2G";} else {strNetworkInfo =  @"3G";}}} else {if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {strNetworkInfo = @"2G";} else {strNetworkInfo = @"3G";}}}}}
    // if ([strNetworkInfo isEqualToString: @"No Network"]) {strNetworkInfo = @"WWAN";}
    return strNetworkInfo;
}
9.一些關於iPhone X底部的設計示範 示範圖一

 

 示範圖二

 

 示範圖三

 

10. 關於iPhoneX的home條(HomeIndicator)的顯隱

先看7,

 圖7 橫屏看撩妹視頻時

這樣的體驗其實是不好的(還怎麼用英文撩妹?),所以為了以防這樣的問題出現,蘋果其實提供了隱藏HomeIndicator的方法,如下,

- (BOOL)prefersHomeIndicatorAutoHidden {
  return YES;
}

在VC 裡邊重寫 prefersHomeIndicatorAutoHidden 返回 YES(預設是NO),Home指示條就能自動隱藏了,此方法是在螢幕若無互動事件響應時,延遲2秒左右會回調此方法。

11. 關於iOS11許可權的變化

1.定位問題:無法定位,第一次使用時沒有彈出定位請求對話方塊。

原因:由於iOS11的定位許可權的key做了更改,在以前iOS11之前的始終允許定位NSLocationAlwaysUsageDescription基礎上添加NSLocationWhenInUseUsageDescription和NSLocationAlwaysAndWhenInUsageDescription。具體參考部落格:http://blog.csdn.net/dangyalingengjia/article/details/77965029

2.相簿許可權問題:iOS11上讀寫相簿的照片時發生崩潰。

原因:由於iOS11相簿相關許可權的key發生了變化。使用者在沒有許可權的情況下,訪問相簿導致崩潰。

iOS11之前對應的key是NSPhotoLibraryUsageDescription,而iOS11的Key變為NSPhotoLibraryAddUsageDescription。同定位的Key一樣,由於key沒有相容性,所以需要保留原key以相容iOS11之前的版本。

12. iOS11 UICollectionview 的scroll indicator等被組視圖遮擋的問題

問題如8紅框地區,

 圖8 UICollectionview bug圖

導致這個的原因是因為組視圖的z座標出現了問題, 有以下兩種解決辦法

第一種: 在該類中重寫layoutSubviews方法<適用於小規模>

- (void)layoutSubviews {
    [super layoutSubviews];
    self.layer.zPosition = 0;
}

第二種: 自訂一個layer, 重寫其zPosition的get方法。然後對組視圖類添加分類方法,重寫layerClass方法即可。

自訂layer:

@implementation YYZPositionZeroLayer

- (CGFloat)zPosition {
    return 0;
}
@end

添加分類重寫組視圖layerClass方法:

@implementationUICollectionReusableView (ZPositionZero)
+ (Class)layerClass {
  return[YYZPositionZeroLayer class];
}
@end
13. iOS11 無法彈出鍵盤問題

問題描述: 在某些時候你會發現調用becomeFirstResponder方法時,並未響應鍵盤,系統鍵盤無法彈出.

問題發現: 如果在調用之前使用了UIAlertView彈出對話方塊,就會導致系統鍵盤無法彈出,猜測是因為UIAlertView在消失遍曆window視窗時存在windowLevel 大於 levelNormal 的window把他作為keywindow

問題解決: 如果你的項目裡面還在使用UIAlertView(2_0,9_0), 建議用UIAlertController替換掉.

14.iOS11 數組文法糖??替換方法的改變

在iOS11 之前,

array[i] 文法糖的替換方法是[array objectAtIndex:i]

在iOS11 之後,

array[i] 文法糖的替換方法是[array objectAtIndexedSubscript:i]

用到動態交換方法的童鞋需要注意

iOS11 與 iPhone X適配的那些坑(持更中...)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.