iOS11, Xcode9 and iphone X适配

前言

最近公司的很多流量产品需要适配iOS 11 和iPhone X,由于公司的iPhone X到的比较晚,拖了好久才对这些流量产品进行更新。

问题

  1. 首先一个很明显的适配问题,就是打开app的时候没有全屏,这时候要加入一张对应尺寸的启动图片就可以。
  • 竖屏尺寸:1125px × 2436px(375pt × 812pt @3x)
  • 横屏尺寸:2436px × 1125px(812pt × 375pt @3x)
  1. 跟启动屏有关的当然还有一个问题,那就是获取屏幕的大小:[[UIScreen mainScreen] bounds].size 加入上面的图片就可以了

导航栏

  1. navigationItem.titleView = 自定义view, 这时候这个自定义的view的大小就会出现问题,而且有点击时间也不会触发。首先,在自定义titleview 里重写 intrinsicContentSize 属性,代码如下

    @property(nonatomic, assign) CGSize intrinsicContentSize;
    

然后在 self.navigationItem.titleView = _titleView; 之前加入下面的代码:

_titleView.intrinsicContentSize = CGSizeMake(200, 40);

自定义的view还是要设置frame,不然不是iOS11还是可能出问题。

  1. 导航栏高度的变化

iOS11之前导航栏默认高度为64pt(这里高度指statusBar + NavigationBar),iOS11之后如果设置了prefersLargeTitles = YES则为96pt,默认情况下还是64pt,但在iPhoneX上由于刘海的出现statusBar由以前的20pt变成了44pt,所以iPhoneX上高度变为88pt,由于刘海多出了24pt的高度,如果项目里隐藏了导航栏加了自定义按钮之类的,这里需要注意适配一下。

968977-89a88f618da51832.png

968977-b19a09df0a51bf50.png

viewSafeAreaInsetsDidChange方法里面打印NSLog(@"%@",NSStringFromUIEdgeInsets(self.view.safeAreaInsets));即可知道安全区域的边界

  1. 在iOS7之后,我们在设置UINavigationItemleftBarButtonItem,rightBarButtonItem的时候都会造成位置的偏移,我们经常习惯使用下面这个方法来调整下间距

    +(UIBarButtonItem *)fixedSpaceWithWidth:(CGFloat)width {`
     UIBarButtonItem *fixedSpace = [[UIBarButtonItem         alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
     fixedSpace.width = width;
     return fixedSpace;
     }
    

但是在iOS11没有效果了,可以通过过改变按钮的 contentEdgeInsetsimageEdgeInsets的值成功改变了按钮的偏移问题,单独设置contentEdgeInsets也可达到一定的效果

底部tarbar

  1. iPhone x:Tabbar从49pt变为83pt,如果是自己定义的tabbar需要自己加上34的高度,否则会点不到对应tabbar。如果是隐藏的tabbar的话,比如底部放了一个banner广告的话,这时候也需要调整对应的高度,在xcode中调整了下如果隐藏tabbar,还要在底部放广告的话可以距离底部24pt,苹果tabbar多加了34,比点击距离多加了10pt,应该是让用户体验更加的好点,不然24的话感觉快点到底部触摸栏的样子。

UITableView and UICollectionView

  1. 在iOS 11上运行tableView向下偏移64px或者20px,因为iOS 11废弃了automaticallyAdjustsScrollViewInsets,而是给UIScrollView增加了contentInsetAdjustmentBehavior属性。避免这个坑的方法是要判断

       if (@available(iOS 11.0, *)) {
         _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
       }else {
         self.automaticallyAdjustsScrollViewInsets = NO;
       }
    
  2. IOS11以后,Self-Sizing默认开启,包括Headers, footers。如果项目中没使用estimatedRowHeight属性,在IOS11下会有奇奇怪怪的现象,默认如果不去实现viewForHeaderInSection就不会调用heightForHeaderInSection,尾部试图一样,因为IOS11之前,estimatedRowHeight默认为0,Self-Sizing自动打开后,contentSizecontentOffset都可能发生改变。可以通过以下方式禁用:

     self.tableView.estimatedRowHeight = 0; 
     self.tableView.estimatedSectionHeaderHeight = 0; 
     self.tableView.estimatedSectionFooterHeight = 0;
    
  3. 列表/页面偏移,设置工程中的UITableView、UICollectionView、UIScrollView的contentInsetAdjustmentBehavior属性,如下:

       if (@available(iOS 11.0, *)){
         _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
      }
    

总的来说所有继承与Scrollview 及其子类都需要设置 contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever ,每个设置很麻烦,没关系。由于UIView及其子类都遵循UIAppearance协议,我们可以进行全局配置:

// AppDelegate 进行全局设置
if (@available(iOS 11.0, *)){
    [[UIScrollView appearance]     setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
  1. 当你在tableView 里面嵌套collectionView 的时候有可能出现一下错误:

     Assertion failure in -[UICollectionViewData validateLayoutInRect:],              /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3694.4.18/UICollectionViewData.m:435
     2017-11-15 15:59:08.616969+0800 tbEmojiGuangchang[70423:3415148] invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
    

    libc++abi.dylib: terminate_handler unexpectedly threw an exception

只要在刷新collectionView之前调用[collectionView.collectionViewLayout invalidateLayout] 就行。

  -(NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
      [collectionView.collectionViewLayout invalidateLayout];
      return 1;
  }
  1. 相册权限
    iOS11之后:默认开启访问相册权限(读权限),无需用户授权,无需添加NSPhotoLibraryUsageDescription,适配iOS11之前的还是需要加的。 添加图片到相册(写权限),需要用户授权,需要添加 NSPhotoLibraryAddUsageDescription,相册的权限状态有以下四种状态:

     PHAuthorizationStatusNotDetermined = 0, // User has not yet made a choice with regards to this application
     PHAuthorizationStatusRestricted,        // This application is not authorized to access photo data.
                                        // The user cannot change this application’s status, possibly due to active restrictions
                                        //   such as parental controls being in place.
    PHAuthorizationStatusDenied,            // User has explicitly denied this application access to photos data.
    PHAuthorizationStatusAuthorized         // User has authorized this application to access photos data.
    

iOS11之前如果还没请求访问相册权限的话状态是:PHAuthorizationStatusNotDetermined ,用户如果点击不允许访问相册的话状态是:PHAuthorizationStatusDenied ,但是在iOS11就很奇葩,还没请求访问相册权限和用户如果点击不允许访问相册的状态都是PHAuthorizationStatusNotDetermined,导致不能判断是否是用户点击不允许的操作,也就没办法弹出那个引导用户去设置开启相册权限的窗口。我这边的做法是如果应用是有需要添加相片到相册的,要提前请求相册功能:

oc 代码:

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    
}];

swift 代码:

if #available(iOS 11.0, *) {
        let library: PHAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        if(library == PHAuthorizationStatus.notDetermined){
            PHPhotoLibrary.requestAuthorization { (status) in
            }
        }
 }
  1. 位置权限

在IOS11,原有的NSLocationAlwaysUsageDeion被降级为NSLocationWhenInUseUsageDeion。因此,在原来项目中使用requestAlwaysAuthorization获取定位权限,而未在plist文件中配置NSLocationAlwaysAndWhenInUseUsageDeion,系统框不会弹出。建议新旧key值都在plist里配置,反正我试下来是没有问题,唯一的区别是使用requestAlwaysAuthorization获取权限 IOS11系统弹框会把几种权限级别全部列出,供用户选择,显然更人性化了。快去更新你的info.plist

 <!-- 位置 -->
<key>NSLocationUsageDescription</key>
<string>获取地理位置,精准推送服务</string>
<!-- 在使用期间访问位置 -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>获取地理位置,精准推送服务</string>
<!-- 始终访问位置 -->
<key>NSLocationAlwaysUsageDescription</key>
<string>App需要您的同意,才能始终访问位置</string>
<!-- iOS 11访问位置 -->
<key>NSLocationAlwaysAndWhenInUseUsageDeion</key>
<string>App需要您的同意,才能始终访问位置</string>
  1. 使用第三方网络监测库报错


    325120-0850ff880b326807.png

解决方式如下:替换成如下代码:

__Check_Compile_Time(sizeof(ICMPHeader) == 8);
__Check_Compile_Time(offsetof(ICMPHeader, type) == 0);
__Check_Compile_Time(offsetof(ICMPHeader, code) == 1);
__Check_Compile_Time(offsetof(ICMPHeader, checksum) == 2);
__Check_Compile_Time(offsetof(ICMPHeader, identifier) == 4);
__Check_Compile_Time(offsetof(ICMPHeader, sequenceNumber) == 6)

后续更新...

  1. 跳转appStore评论的链接更换了,很正常,因为iOS11之后appStore就大改版了,当然跳到里面的链接应该也是会有所变化的,之前iOS11的链接是这样的:

    http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=XXXXXXXX&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8"
    

iOS11之后需要改称以下这样,当然iOS11之前这个链接也是适用的:

itms-apps://itunes.apple.com/cn/app/idXXXXXX?mt=8&action=write-review
  1. UIToolBar 的坑,当你使用view集成UIToolBar的时候,这个时候使用xcode9运行的时候会发现一个非常坑的问题,就是在view的最顶层会多出一层UIToolBarContenVIew出来,到时你的整个view没办法点击,建议不要用UIToolbar来继承。


    CA99B4BE-B322-453E-951E-A0B5B32E4530.png

总结

以上是我在适配我的一些产品的时候碰到的一些问题,当然还有一些其他很小的细节有问题,只需要稍微调整就行,在这里就不提了,苹果每次更新一个大版本的时候都会出现各种各样的问题,很多东西也变得越来越复杂,后面有在项目中碰到问题会在继续更新~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容