標籤: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適配的那些坑(持更中...)