美文网首页
Xcode9 iOS 11适配iPhone X总结

Xcode9 iOS 11适配iPhone X总结

作者: 勇敢的呆喵 | 来源:发表于2017-10-09 17:31 被阅读256次

    先看看有哪些开发时需要注意的更新:

    Xcode9 的变化:
    一, 创建新的颜色 asset catalog
    New color set

    通常我们会New image set, 现在 可以New color set . 然后填充 rgb alpha 值

    可以直接引用颜色

    在 xcassets 里添加颜色,在代码或者 IB 中直接引用该颜色:

    二, 对 Folder 管理也有加强, Group 默认就是 Folder, 并且现在删掉一个 Folder,文件系统里的那个也会被真的删掉)。
    iPhone X变化:
    一, 屏幕尺寸相关变化
    • 高度增加了145pt,变成812pt.
    • 屏幕圆角显示,注意至少留10pt边距.
    • 状态栏高度由20pt变成44pt,留意这个距离就能避开刘海的尴尬,相应的导航栏以上变化64->88.
    • 底部工具栏需要为home indicator留出34pt边距.
    • 物理分辨率为1125px * 2436px.
    二, APP内部样式适配

    iOS11为UIViewController和UIView增加了两个新的属性safeAreaInsets和safeAreaLayoutGuide, 通过这两个属性我们可以获得安全区域的范围, 我们要做的是让那些不能被遮挡的内容和控件在安全区域范围内显示.

    • safeAreaInsets 适用于手动计算.
    • safeAreaLayoutGuide 适用于自动布局.

    iOS11 为UIViewController和UIView增加了一个新的方法-(void)viewSafeAreaInsetsDidChange;需要注意下调用顺序:

    • viewDidLoad
    • viewWillAppear
    • viewSafeAreaInsetsDidChange

    ▿ UIEdgeInsets

    • top : 44.0
    • left : 0.0
    • bottom : 34.0
    • right : 0.0
    • viewWillLayoutSubviews
    • viewDidAppear
      如果需要改变一个UIViewController的safeAreaInsets值, 可以通过设置addtionalSafeAreaInsets属性来实现, 例如你要自定义一些特殊的样式时.
      如果你改变了一个UIViewController的safeAreaInsets属性值,- (void)viewSafeAreaInsetsDidChange也会被调用.
    三, DeviceCheck

    DeviceCheck 允许你通过你的服务器与 Apple 服务器通讯,并为单个设备设置两个 bit 的数据。在设备上用 DeviceCheck API 生成一个 2字节的 token (00, 01,10,11),然后将这个 token 发给自己的服务器,再由自己的服务器与 Apple 的 API 进行通讯,来更新或者查询该设备的值。这两字节 的数据用来追踪用户。比如。借助两个自己的数据,你可以得知用户究竟使用了该 App 多久。
    使用场景:

    • 试用7天
    • Uber、滴滴司机被封号后,防止重新注册账号接单
    • 该用户是否已经领取过首次注册红包
    • APP防多开

    因为传输的是 flag 级别的数据,并不会定位到该设备的使用者,所以相对安全。
    目前来看不影响UUID使用;

    四, IOS11以后,Self-Sizing默认开启,包括Headers, footers。

    如果项目中没使用estimatedRowHeight属性,在IOS11下会有奇奇怪怪的现象,因为IOS11之前,estimatedRowHeight默认为0,Self-Sizing自动打开后,contentSize和contentOffset都可能发生改变。
    可以通过以下方式禁用:

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

    实际项目适配时遇到的一些问题:

    没有真机, 所以用模拟器做的适配. 发现几个问题, 一步一步记录一下:
    一. 刚升级Xcode9发现编译不过, 各种编译时报错;
    一跑就报错

    看到有人说解决方案是把这里勾选上:


    把这里打上勾

    不行啊大哥┭┮﹏┭┮这么干编译是没问题了, 一跑起来就崩了, 必要的库没加载吧;
    解决方案:

    • 更新 cocoapods 的所有库;
    • 去掉UMeng_SDK_social;
      不吐槽友盟社会化分享组件了, 我看了下它最近一次更新大概在2013年, 千万不要用啊;
      如果没记错这两步一弄编译就没问题了, 接下来就跑起来看看;
    二. 如果有联网监测, 在APP启动时检测是否联网, 通过获取状态栏联网指示器的dataNetworkType来检测时, 在模拟器上会报错;

    解决方法 : 区分模拟器和真机, 模拟器状态下手动设置网络状态;

    三. scrollview及其子类偏移64pt, 像这样:
    collectionview偏移64
    是因为之前使用self.automaticallyAdjustsScrollViewInsets = NO;来取消偏移,但是这个方法在iOS 11被废弃, 换成使用
     if (@available(iOS 11.0, *)) {
            self.homeScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }
    
    四. 刘海适配

    iOS 11以前statusbar 高度20 , iOS 11刘海24, 所以statusbar 高度变成20+24 = 44 , 如果是自定义的导航栏 或者导航栏内有功能性按钮, 建议动态获取statusbar 高度适配刘海;

    刘海导航栏适配
    五,有些在iOS11以下可以正常显示的界面, 变得不正常了, 一部分是因为带刘海的statusbar 高度变化导致的, 检查下代码里有没有使用魔法数字的约束或frame, 参考第三步适配下;
    六, tableview显示异常, 比如这里每个cell里的内容显示不完全, 高度也不对:
    cell内容和高度显示异常

    这是因为iOS 11取消了xib里对自适应的支持,所以这里手动计算并设置下cell高度即可解决问题;

    update ----------2017-10-11--------------update
    更正下, iOS 11还是支持自适应的, 只不过需要手动开启下:

    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = 100;
    

    持续更新ing~
    test time

    相关文章

      网友评论

          本文标题:Xcode9 iOS 11适配iPhone X总结

          本文链接:https://www.haomeiwen.com/subject/famgnttx.html