日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS11 与 iPhone X适配的那些坑(持更中...)

發(fā)布時(shí)間:2025/4/9 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS11 与 iPhone X适配的那些坑(持更中...) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄 問(wèn)題列表

1.適配iPhoneX 屏幕原則

2.適配過(guò)程一些常量的設(shè)置

3..iPhone X 上運(yùn)行有黑色區(qū)域問(wèn)題

4.iOS11導(dǎo)航欄適配?

5.出現(xiàn)UIScrollview 漂移問(wèn)題(基本都是iPhoneX上)

6.UITableView 出現(xiàn)的遮擋顯示問(wèn)題(三行代碼解決,放到基類)

7.iOS11 UICollectionview 的scroll indicator等被組視圖遮擋的問(wèn)題

8.一些關(guān)于iPhone X底部的設(shè)計(jì)示范

9.關(guān)于iPhoneX的home條(HomeIndicator)的顯隱

10.有些導(dǎo)致iPhoneX獲取網(wǎng)絡(luò)狀態(tài)崩潰的問(wèn)題

11.關(guān)于iOS11權(quán)限的變化

12.XCode9添加資源文件不能獲取路徑問(wèn)題

13.iOS11 無(wú)法彈出鍵盤(pán)問(wèn)題

14.iOS11 數(shù)組語(yǔ)法糖?替換方法的改變

1. 適配iPhoneX 屏幕原則

圖5 iphoneX 豎屏 圖6 iPhoneX 橫屏

設(shè)計(jì)原則:讓那行可操作、不可阻擋的控件或視圖顯示在圖5、圖6的藍(lán)色區(qū)域(安全區(qū)域safeArea)。

示范圖一

?

示范圖二

?

示范圖三

頂部危險(xiǎn)區(qū)距離:44

底部危險(xiǎn)區(qū)距離:34

2. 適配過(guò)程一些常量的設(shè)置

#define IS_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO) //狀態(tài)欄高度 #define kStatusBarHeight (CGFloat)(IS_iPhoneX?(44):(20)) // iPhoneX的狀態(tài)欄高度差值 #define kTopBarDifHeight (CGFloat)(IS_iPhoneX?(24):(0)) // 頂部安全區(qū)域遠(yuǎn)離高度 #define kTopBarSafeHeight (CGFloat)(IS_iPhoneX?(44):(0)) // 狀態(tài)欄和導(dǎo)航欄總高度 #define kNavBarHAbove (CGFloat)(IS_iPhoneX?(88):(64)) // TabBar高度 #define kTabBarHeight (CGFloat)(IS_iPhoneX?(49+34):(49)) // 底部安全區(qū)域遠(yuǎn)離高度 #define kBottomSafeHeight (CGFloat)(IS_iPhoneX?(34):(0))

3.?iPhone X 上運(yùn)行有黑色區(qū)域問(wèn)題

啟動(dòng)圖問(wèn)題,使用LaunchScreen來(lái)做啟動(dòng)圖 或者 修改Assets中的LaunchImage,添加iPhoneX的Launch圖1125*2436(px) 豎屏模式。

.

通過(guò)LaunchScreen.storyboard方式啟動(dòng)

如果使用的是Assets中的LaunchImage, 在增加了iPhone X尺寸的圖片配置后.

LaunchScreen.storyboard方式不用多說(shuō), 這里說(shuō)一下如何在LaunchImage中增加iPhone X尺寸的圖片配置.

方法一:

準(zhǔn)備一張尺寸:1125 * 2436的 3x啟動(dòng)圖片, 移動(dòng)到LaunchImage的Finder目錄中, 并在LaunchImage中的Contents.json文件中增加 (注意Json格式):

{

"extent" : "full-screen",

"idiom" : "iphone",

"subtype" : "2436h",

"filename" : "圖片名.png",

"minimum-system-version" : "11.0",

"orientation" : "portrait",

"scale" : "3x"

}

?

?

方法二:

?

?

?

?

?

?

2.引導(dǎo)頁(yè)iPhone X圖片變形

?

?

?

?

由于iPhone X高度發(fā)生變化,圖片鋪滿整個(gè)屏幕時(shí)候造成圖片拉伸,現(xiàn)在需要UI切一個(gè)1125*2436的3x圖片和以前做iPhone X機(jī)型判斷1124*2001圖片,并且對(duì)圖片contentMode屬性進(jìn)行設(shè)置

if (IS_iPhoneX) {

coverImageNames = [NSArray arrayWithObjects:@"img_big_1_ipx.jpg", @"img_big_2_ipx.jpg",@"img_big_3_ipx.jpg", @"img_big_4_ipx.jpg",nil];

}else{

coverImageNames = [NSArray arrayWithObjects:@"img_big_1.jpg", @"img_big_2.jpg",@"img_big_3.jpg", @"img_big_4.jpg",nil];

}

imageView.clipsToBounds = YES;//超出區(qū)域裁剪

imageView.contentMode = UIViewContentModeScaleAspectFill;//圖片等比例拉伸,會(huì)填充整個(gè)區(qū)域,但是會(huì)有一部分過(guò)大而超出整個(gè)區(qū)域

4、導(dǎo)航欄

4.1在解釋導(dǎo)航欄變化之前先解釋一個(gè)iOS 11的新特性:設(shè)置大標(biāo)題,通過(guò)BOOL類型的prefersLargeTitles屬性來(lái)設(shè)置。默認(rèn)設(shè)置是不開(kāi)啟

//顯示大標(biāo)題“設(shè)置”self.navigationController.navigationBar.prefersLargeTitles = YES;self.navigationItem.title = @"設(shè)置";//通過(guò)navigationItem的largeTitleDisplayMode屬性來(lái)設(shè)置:self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;//其中LargeTitle還有三種樣式可以選擇:UINavigationItemLargeTitleDisplayModeNever//總是顯示小標(biāo)題UINavigationItemLargeTitleDisplayModeAlways//總是顯示大標(biāo)題UINavigationItemLargeTitleDisplayModeAutomatic//自動(dòng)顯示大標(biāo)題或小標(biāo)題。即初始時(shí)是大標(biāo)題,滑動(dòng)時(shí)大標(biāo)題隱藏、顯示小標(biāo)題。

4.2. iOS11 系統(tǒng)導(dǎo)航欄上自定義view的顯示問(wèn)題

之前代碼設(shè)置導(dǎo)航欄:

self.navigationItem.titleView = customView;

會(huì)出現(xiàn)這樣的問(wèn)題,如下圖3,

圖3 導(dǎo)航欄出錯(cuò)

界面出亂的原因是因?yàn)閕OS11調(diào)整了導(dǎo)航欄圖層結(jié)構(gòu)。快速簡(jiǎn)便的修改方式,直接上代碼,

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

但是需在控制器的dealloc里移除你的自定義view,

[YourCustomView removeFromSuperview];?

下圖4為修改好的自定義視圖

圖4


(1)在iPhone X中導(dǎo)航欄高度變成88,項(xiàng)目中自定義導(dǎo)航欄高度64,需要對(duì)導(dǎo)航欄高度進(jìn)行判斷

_navigationBar = [[MCCustomNavigationBar alloc]initWithFrame:CGRectMake(0, 0, SCREENW, 64) andType:CustomBarType_Home];

_navigationBar = [[MCCustomNavigationBar alloc]initWithFrame:CGRectMake(0, 0, SCREENW, kStatusBarAndNavigationBarHeight) andType:CustomBarType_Home];

(2)搜索框和左右兩邊按鈕高度有問(wèn)題,因?yàn)閕Phone X中狀態(tài)欄高度由20增加24變成44,所以搜索框和左右兩邊按鈕高度在iPhone X上距頂部高度加上24高度,

#define itemTopOffset (IS_iPhoneX ? (26+24) : 26)

[self.leftBtn mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.offset(itemHorOffset);

make.height.equalTo(@(itemHeight));

make.width.equalTo(@(itemHeight));

make.top.offset(itemTopOffset);

}];

(3)iOS11上searchBar高度明顯變大,


UISearchBar改變搜索框的高度

系統(tǒng)的searchBar

UISearchBar的中子控件及其布局

UIView(直接子控件) frame 等于 searchBar的bounds,view的子控件及其布局

UISearchBarBackground(間接子控件) frame 等于searchBar的bounds

UISearchBarTextField(間接子控件) frame.origin等于(8.0, 6.0),即不等于searchBar的bounds

改變searchBar的frame只會(huì)影響其中搜索框的寬度,不會(huì)影響其高度,原因如下:

系統(tǒng)searchBar中的UISearchBarTextField的高度默認(rèn)固定為28

左右邊距固定為8,上下邊距是父控件view的高度減去28除以2

改變UISearchBar的高度

方案

重寫(xiě)UISearchBar的子類(MCSearchBar),重新布局UISearchBar子控件的布局

增加成員屬性contentInset,控制UISearchBarTextField距離父控件的邊距

若用戶沒(méi)有設(shè)置contentInset,則計(jì)算出默認(rèn)的contentInset

若用戶設(shè)置了contentInset,則根據(jù)最新的contentInset布局UISearchBarTextField

新建UISearchBar的子類,增加成員屬性contentInset,用來(lái)調(diào)整UISearchBarTextField距離父控件的邊距。contentInset的setter方法

#pragma mark - setter method

- (void)setContentInset:(UIEdgeInsets)contentInset {

_contentInset.top = contentInset.top;

_contentInset.bottom = contentInset.bottom;

_contentInset.left = contentInset.left;

_contentInset.right = contentInset.right;

self.isChangeFrame = YES;

[self layoutSubviews];

}

- (void)layoutSubviews {

[super layoutSubviews];

for (UIView *subView in self.subviews[0].subviews) {

if ([subView isKindOfClass:[UIImageView class]]) {

//移除UISearchBarBackground

[subView removeFromSuperview];

}

if ([subView isKindOfClass:[UITextField class]]) {

CGFloat height = self.bounds.size.height;

CGFloat width = self.bounds.size.width;

if (_isChangeFrame) {

//說(shuō)明contentInset已經(jīng)被賦值

// 根據(jù)contentInset改變UISearchBarTextField的布局

subView.frame = CGRectMake(_contentInset.left, _contentInset.top, width - 2 * _contentInset.left, height - 2 * _contentInset.top);

} else {

// contentSet未被賦值

// 設(shè)置UISearchBar中UISearchBarTextField的默認(rèn)邊距

CGFloat top = (height - 28.0) / 2.0;

CGFloat bottom = top;

CGFloat left = 8.0;

CGFloat right = left;

_contentInset = UIEdgeInsetsMake(top, left, bottom, right);

subView.frame = CGRectMake(_contentInset.left, _contentInset.top, width - 2 * _contentInset.left, height - 2 * _contentInset.top);

}

}

}

}

在項(xiàng)目中使用自定義的MCSearchBar,SearchBar的高度可以改變

(4)iOS11中UISearchBar沒(méi)有居中居左顯示,并且icon和placeholder間距太窄

現(xiàn)在實(shí)現(xiàn)居中顯示

@property(nonatomic,assign)CGFloatwidth;

//判斷版本

if(@available(iOS11.0, *)){

UITextField *textField = [self.searchBar valueForKey:@"searchField"];

[textField sizeToFit];

//記錄一下這個(gè)時(shí)候的寬度

_width= textField.frame.size.width;

[_searchBar setPositionAdjustment:UIOffsetMake((_searchBar.width-_width)/2.0,0)forSearchBarIcon:UISearchBarIconSearch];

}

然后在代理方法 searchBarTextDidBeginEditing:(UISearchBar*)searchBar 調(diào)整位置

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{

if (@available(iOS 11.0, *)) {

if(!_searchBar.text.length) {

[_searchBar setPositionAdjustment:UIOffsetMake(0,0)forSearchBarIcon:UISearchBarIconSearch];

}

}

}

結(jié)束的方法? searchBarTextDidEndEditing:(UISearchBar*)searchBar 判斷是否有內(nèi)容

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{

if (@available(iOS 11.0, *)) {

if(!_searchBar.text.length) {

[_searchBar setPositionAdjustment:UIOffsetMake((_searchBar.width-self.width)/2.0,0) forSearchBarIcon:UISearchBarIconSearch];

}

}

}

如果有占位文字后臺(tái)返的,UITextField在搜索框默認(rèn)文字大小17,可以根據(jù)文字個(gè)數(shù)和大小算出占位文字寬度,然后算出搜索圖標(biāo)的偏移量.


?

(5)搜索頁(yè)面導(dǎo)航欄中搜索框距離返回按鈕太近

?

?

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, testView.width - (SCREENW > 320 ? 90: 100)*SCREEN_Proportion, testView.height)];

由于搜索框距離左邊距離導(dǎo)致的,現(xiàn)在需要定義一個(gè)宏做判斷

#define marginLeft (IS_iPhoneX ? 10 : 0)

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(marginLeft, 0, testView.width - (SCREENW > 320 ? 90: 100)*SCREEN_Proportion, testView.height)];

?

?

5. 出現(xiàn)UIScrollview 漂移問(wèn)題(基本都是iPhoneX上)

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

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

同時(shí),如果在push進(jìn)入webview頁(yè)面時(shí),底部會(huì)有黑邊一閃而過(guò),也可用此方法解決。

若嫌麻煩,每個(gè)scrollview及其子類都要去設(shè)置的話,也可以使用以下方法

// AppDelegate 里進(jìn)行全局設(shè)置 if(@available(iOS 11.0, *)){[[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];

?

?

?

?

?

四:UITableview UICollectionView MJRefresh下拉刷新錯(cuò)亂

iOS11表格用MJRefresh框架下拉刷新的時(shí)候界面會(huì)閃,顯示紊亂,

原因是iOS11棄用了automaticallyAdjustsScrollViewInsets屬性,新增contentInsetAdjustmentBehavior來(lái)替代它

tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

解決方法:MJRefresh作者已經(jīng)針對(duì)iOS 11和iPhone X做了適配,把MJRefresh更新最新的版本

//聲明tableView的位置 添加下面代碼

if (@available(iOS 11.0, *)) {

_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

_tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);

_tableView.scrollIndicatorInsets = _tableView.contentInset;

}

六.純代碼適配底部工具欄

在iPhone X中底部工具欄需要為home indicator留出34pt邊距,iPhone X以前機(jī)型TarBar高度49,iPhone X中Tarbar高度加上34變成83.由于項(xiàng)目中Tabbar是用自定義的,需要對(duì)Tabbar的高度做適配,用到宏#define kTabbarHeight (IS_iPhoneX ? (49.f+34.f) : 49.f)

?

?

?

適配前代碼

_customBarView = [[UIView alloc] initWithFrame:CGRectMake(0, SCREENH - 49,SCREENW, 49)];

適配后的代碼_customBarView = [[UIView alloc] initWithFrame:CGRectMake(0, SCREENH - kTabbarHeight,SCREENW, kTabbarHeight)];

?

?

圖標(biāo)和文字和其他機(jī)型相比偏下,現(xiàn)在需要對(duì)圖標(biāo)和文字高度進(jìn)行調(diào)整,做iPhone X和非iPhone X機(jī)型適配

?

?

?

?

?

七.底部view出現(xiàn)問(wèn)題

?

(1)購(gòu)物車View適配,涉及頁(yè)面商品詳情頁(yè),搜索頁(yè)面,購(gòu)物車頁(yè)面

?

?

?

?

?

?

?

(2)自定義數(shù)字鍵盤(pán)適配

?

?

?

適配底部用的一個(gè)宏#define? kTabbarSafeBottomMargin? ? ? ? (IS_iPhoneX ? 34.f : 0.f)用于計(jì)算距離屏幕頂部高度,如果iPhone X,留出距離屏幕底部34安全距離,控件不能顯示34安全距離上

?

適配前代碼

?

適配后代碼

?

(3)篩選views適配

?

適配前

?

適配后

?

?九.自定義分割線處理

1.iOS 11分割線顏色加深

iOS 11中有的自定義分割線顏色莫名奇妙變深,很難看,如下圖所示,不符合設(shè)計(jì)規(guī)范,嘗試其他方法沒(méi)有解決這個(gè)問(wèn)題,最后通過(guò)改變分割線的透明度來(lái)解決

?

適配前

適配后

2.沒(méi)有文字顯示分割線

// 這些界面以下使用代理方法來(lái)設(shè)置,發(fā)現(xiàn)并沒(méi)有生效

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;

// 這樣的原理是因?yàn)橹爸皇菍?shí)現(xiàn)了高度的代理方法,卻沒(méi)有實(shí)現(xiàn)View的代理方法,iOS10及以前這么寫(xiě)是沒(méi)問(wèn)題的,iOS11開(kāi)啟了行高估算機(jī)制引起的bug,因此有以下幾種解決方法:

// 解決方法一:添加實(shí)現(xiàn)View的代理方法,只有實(shí)現(xiàn)下面兩個(gè)方法,方法 (CGFloat)tableView: heightForFooterInSection: 才會(huì)生效

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {

return nil;

}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

return nil;

}

// 解決方法二:直接使用tableView屬性進(jìn)行設(shè)置,修復(fù)該UI錯(cuò)亂

self.tableView.sectionHeaderHeight = 0;

self.tableView.sectionFooterHeight = 5;

[_optionTableView setContentInset:UIEdgeInsetsMake(-35, 0, 0, 0)];

// 解決方法三:添加以下代碼關(guān)閉估算行高

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

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

8.有些導(dǎo)致iPhoneX獲取網(wǎng)絡(luò)狀態(tài)崩潰的問(wèn)題

直接上代碼,無(wú)需通過(guò)KVC得到圖層名獲取網(wǎng)絡(luò)狀態(tài),一勞永逸!(因還不熟悉markdown語(yǔ)法,以下代碼需自行縮進(jìn)

#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;
//獲得連接的標(biāo)志? ?
? ? BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability,&flags);
? ? CFRelease(defaultRouteReachability);
//如果不能獲取連接標(biāo)志,則不能連接網(wǎng)絡(luò),直接返回
? ? if(!didRetrieveFlags){ return strNetworkInfo;} BOOL isReachable = ((flags & kSCNetworkFlagsReachable)!=0);BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired)!=0);if(!isReachable || needsConnection) {return strNetworkInfo;} // 網(wǎng)絡(luò)類型判斷
? ? 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;
}

?10. 關(guān)于iPhoneX的home條(HomeIndicator)的顯隱

先看下圖7,

圖7 橫屏看撩妹視頻時(shí)

這樣的體驗(yàn)其實(shí)是不好的(還怎么用英文撩妹?),所以為了以防這樣的問(wèn)題出現(xiàn),蘋(píng)果其實(shí)提供了隱藏HomeIndicator的方法,如下,

- (BOOL)prefersHomeIndicatorAutoHidden {
? return YES;
}

在VC 里邊重寫(xiě) prefersHomeIndicatorAutoHidden 返回 YES(默認(rèn)是NO),Home指示條就能自動(dòng)隱藏了,此方法是在屏幕若無(wú)交互事件響應(yīng)時(shí),延遲2秒左右會(huì)回調(diào)此方法。

11. 關(guān)于iOS11權(quán)限的變化

1.定位問(wèn)題:無(wú)法定位,第一次使用時(shí)沒(méi)有彈出定位請(qǐng)求對(duì)話框。

原因:由于iOS11的定位權(quán)限的key做了更改,在以前iOS11之前的始終允許定位NSLocationAlwaysUsageDescription基礎(chǔ)上添加NSLocationWhenInUseUsageDescription和NSLocationAlwaysAndWhenInUsageDescription。具體參考博客:http://blog.csdn.net/dangyalingengjia/article/details/77965029

2.相冊(cè)權(quán)限問(wèn)題:iOS11上讀寫(xiě)相冊(cè)的照片時(shí)發(fā)生崩潰。

原因:由于iOS11相冊(cè)相關(guān)權(quán)限的key發(fā)生了變化。用戶在沒(méi)有權(quán)限的情況下,訪問(wèn)相冊(cè)導(dǎo)致崩潰。

iOS11之前對(duì)應(yīng)的key是NSPhotoLibraryUsageDescription,而iOS11的Key變?yōu)镹SPhotoLibraryAddUsageDescription。同定位的Key一樣,由于key沒(méi)有兼容性,所以需要保留原key以兼容iOS11之前的版本。

12. iOS11 UICollectionview 的scroll indicator等被組視圖遮擋的問(wèn)題

問(wèn)題如下圖8紅框區(qū)域,

圖8?UICollectionview bug圖

導(dǎo)致這個(gè)的原因是因?yàn)榻M視圖的z坐標(biāo)出現(xiàn)了問(wèn)題, 有以下兩種解決辦法

第一種: 在該類中重寫(xiě)layoutSubviews方法<適用于小規(guī)模>

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

第二種: 自定義一個(gè)layer, 重寫(xiě)其zPosition的get方法。然后對(duì)組視圖類添加分類方法,重寫(xiě)layerClass方法即可。

自定義layer:

@implementation YYZPositionZeroLayer

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

添加分類重寫(xiě)組視圖layerClass方法:

@implementationUICollectionReusableView (ZPositionZero)
+ (Class)layerClass {
? return[YYZPositionZeroLayer class];
}
@end

12. XCode9添加資源文件不能獲取路徑問(wèn)題

XCode9調(diào)用[[NSBundle mainBundle] pathForResource:resourceNameofType:nil];方法來(lái)獲取文件路徑,返回為nil. 添加正確方式如下圖1,

圖1? 添加資源選項(xiàng)

但是XCode9 卻埋了一道坑,如下圖2, 點(diǎn)擊資源文件,找到文件選項(xiàng)

圖2? 資源文件選項(xiàng)

紅框區(qū)域未默認(rèn)勾選, 只要把這個(gè)復(fù)選框勾選即可解決.? 具體原因是:xcode9 添加文件使用addfile 拖拽的文件不會(huì)自動(dòng)添加到Compile Sources 和 Copy Bundle Resources 下.

13. iOS11 無(wú)法彈出鍵盤(pán)問(wèn)題

問(wèn)題描述: 在某些時(shí)候你會(huì)發(fā)現(xiàn)調(diào)用becomeFirstResponder方法時(shí),并未響應(yīng)鍵盤(pán),系統(tǒng)鍵盤(pán)無(wú)法彈出.

問(wèn)題發(fā)現(xiàn): 如果在調(diào)用之前使用了UIAlertView彈出對(duì)話框,就會(huì)導(dǎo)致系統(tǒng)鍵盤(pán)無(wú)法彈出,猜測(cè)是因?yàn)閁IAlertView在消失遍歷window窗口時(shí)存在windowLevel 大于 levelNormal 的window把他作為keywindow

問(wèn)題解決: 如果你的項(xiàng)目里面還在使用UIAlertView(2_0,9_0), 建議用UIAlertController替換掉.

14.iOS11 數(shù)組語(yǔ)法糖?替換方法的改變

在iOS11 之前,

array[i] 語(yǔ)法糖的替換方法是[array objectAtIndex:i]

在iOS11 之后,

array[i] 語(yǔ)法糖的替換方法是[array objectAtIndexedSubscript:i]

用到動(dòng)態(tài)交換方法的童鞋需要注意

free(properties);

}

?

轉(zhuǎn)載于:https://www.cnblogs.com/edensyd/p/8418021.html

總結(jié)

以上是生活随笔為你收集整理的iOS11 与 iPhone X适配的那些坑(持更中...)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。