适配iPhone X和iOS 11的随笔

前言:
9月20日,Xcode 9正式上线了,终于可以揭开iPhone X的神秘面纱了,好奇夹杂着兴奋的同时,依然带有可能被坑的不安。

适配iOS 11

1.Xcode 9有些编译报错

作者碰到编译错误的库有RealReachability。在Apple的这个网络监听库中,/Ping/PingFoundation.h中有使用编译时态的语法,然后提示错误。解决方法既可以替换最新的库,也可以将代码改成一下。


适配iPhone X和iOS 11的随笔_第1张图片
60116C5B-D895-46DD-8630-AC1809632EAA.png

可能读者你的项目还有别的错误,针对不同问题,可以去网上找相对应的错误的解决方法,也可以去及时替换第三方库,作者就不再此一一列举了。

2.屏幕尺寸不对,iPhone X为何屏幕尺寸还停留在375*667下?

问题描述: iPhone X的屏幕尺寸是375pt×812pt @3x,所以需要新给1125 * 2436。显示效果如下图

适配iPhone X和iOS 11的随笔_第2张图片
7CA8B6AD-5FF3-4B47-9B71-74705F4EEF6B.png

可以看出显示的区域并不是375*812,而从打印的日志 NSLog(@"current bounds:%@",NSStringFromCGRect([UIScreen mainScreen].bounds));
也是 当前的view frame:{{0, 0}, {375, 667}},所以iPhone X并没有获取正确的屏幕尺寸。
问题解决:其实,这个问题之前也遇到过。很多项目在配置LaunchImage时,使用的是Assets,如下图。
适配iPhone X和iOS 11的随笔_第3张图片
713FBA03-CBF2-4237-8718-243256BCC500.png

而iPhone X的屏幕尺寸是375pt×812pt @3x,所以需要在Assets里将LaunchImage进行修改。将原有的LaunchImage.Assets删了重新 创建带iPhone X的Landscape,并且图片尺寸为375×3 * 812×3即可。

3.iPhone X的状态栏变成了44点了

4.关于iOS 11的适配

(1)UITableViewStyleGrouped类型的UITableView顶部留白问题
原因:在于代码只实现了heightForHeaderInSection方法而没有实现viewForHeaderInSection方法。只实现高度没实现view在iOS11之前没有问题,而iOS11之后由于开启了估算行高机制引起的bug。
解决方式:
第一种方式:添加viewForHeaderInSection方法即可解决。
第二种方式:

    self.tableView.estimatedSectionHeaderHeight = 16;  //该值根据自己项目进行设置
    self.tableView.estimatedSectionFooterHeight = 0.1;

(2)iOS11下APP中tableView内容下移20pt或者64pt
原因:iOS11中的Controller的automaticallyAdjustsScrollViewInsets属性被废弃了,所以当tableView超过安全区域时,系统自动调整了SafeAreaInsets值,进而影响adjustedContentInset属性,而不是contentInset。所以adjustedContentInset值调整,导致tableView下移了20pt或者64pt。(自己在调试的时候可以打印,如下代码)

NSLog(@"safe area insets:%@",NSStringFromUIEdgeInsets(self.scrollView.safeAreaInsets));//注意打印该句话,需要在scrollView已经创建完成打印,如在viewWillDisappear:中打印,刚创建的时候是默认UIEdgeInsetsZero值的

解决方式:
第一种解决方式:重新设置scrollView的contentInset值,来抵消SafeAreaInset值
第二种解决方式:设置scrollView的contentInsetAdjustmentBehavior值,如下代码

 if (@available(iOS 11.0, *)) {
        self.tableView.contentInsetAdjustmentBehavior = UIApplicationBackgroundFetchIntervalNever;
    }

第三种解决方式:通过新增属性addtionalSafeAreaInset。
iOS 11之前,大家是通过将Controller的automaticallyAdjustsScrollViewInsets属性设置为NO,来禁止系统对tableView调整contentInsets的。如果还是想从Controller级别解决问题,那么可以通过设置Controller的additionalSafeAreaInsets属性,如果SafeAreaInset值为(20,0,0,0),那么设置additionalSafeAreaInsets属性值为(-20,0,0,0),则SafeAreaInsets不会对adjustedContentInset值产生影响,tableView内容不会显示异常。这里需要注意的是addtionalSafeAreaInset是Controller的属性,要知道SafeAreaInset的值是由哪个Controller引起的,可能是由自己的Controller调整的,可能是navigationController调整的。是由哪个Controller调整的,则设置哪个Controller的addtionalSafeAreaInset值来抵消掉SafeAreaInset值
注:参考iOS 11 安全区域适配总结

快速解决方式

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    if (@available(iOS 11.0, *)) {
        UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        UITableView.appearance.estimatedRowHeight = 0;
        UITableView.appearance.estimatedSectionFooterHeight = 0;
        UITableView.appearance.estimatedSectionHeaderHeight = 0;
    } else {
        // Fallback on earlier versions
    }
    //....
}

(3)iOS11相册权限变更
iOS11之后:默认开启访问相册权限(读权限),无需用户授权,无需添加NSPhotoLibraryUsageDescription,适配iOS11之前的还是需要加的。添加图片到相册(写权限),需要用户授权,需要添加 NSPhotoLibraryAddUsageDescription

在谈谈Xcode 9的一些新的别的功能

Xcode 9的无线调试
前提要求:①Xcode 9 ②真机设备iOS 11 ③mac和真机同处一个wifi环境

第一步:还是要用线☺️先连接,打开Windows->Device and Simulators,选择你要的真机。

适配iPhone X和iOS 11的随笔_第4张图片
EDE2B05A-D366-419A-BD05-7299BBE43778.png

第二步:你的设备右侧会出现一个球状标识, 到此你就可以拔掉数据线, 开始无效调试咯

适配iPhone X和iOS 11的随笔_第5张图片
71E8B750-F21C-47D0-8342-2FF12925AAF2.png

你可能感兴趣的:(适配iPhone X和iOS 11的随笔)