美文网首页学无止境在iOS开发的道路上越走越远ios开发学习
针对iOS11做出的App适配工作(干货分享,持续更新)

针对iOS11做出的App适配工作(干货分享,持续更新)

作者: CX_cxy | 来源:发表于2017-09-19 12:29 被阅读365次

    伴随着iOS11的发布,iOS端App 又是一波适配的工作,emmmmm,

    首先再官网上下载了Xcode 9 GM 版本,伴随着Mac OS 从10.12.5 升级到了 10.12.6 (Xcode 9 只支持在最新的系统上运行),还好公司的网速给力,不到俩小时的时间,各种下载工作全部搞定。

    对于iOS11 的SDK 更新了哪些内容,这里不做叙述,详情请看:

    iOS 11 SDK 介绍Developer iOS以及WWDC的视频啦Updating Your App for iOS 11

    下面主要记录在适配项目App的时候遇到的问题:

    1.首先导航栏自定义View不能点击!!

    导航栏右边Item自定义View

    这就有点尴尬了,于是开始定位问题, 这是一个自定义的View组件, 然后,Autolayout做好约束,规则是这样的,两个Button的Icon 都是固定的尺寸,固定大小, 如图: 

    然后发现没有拉左右和上下的约束~ emmmmm,iOS11之前都是没问题的, 然后,拉好约束,如图:

    完美解决。

    2.tableViewSection 莫名出现分割线!!

    效果图如下:

    定位原因,这种是因为自己代码写的TableView,然后AddSubView 到自己的Controller里面的。主要因为Table Views 在iOS11 中默认启用Self-Sizing,我们在iOS 8之后, 使用

    tableView.rowHeight = UITableViewAutomaticDimension

    tableView.estimatedRowHeight = 200

    然后,在cell里面使用Autolayout 拉好上下左右的约束, tableView 就会动态展示内容了,这是因为estimateRowHeight相当于预估算行高的作用。

    然后,项目中,是只写了-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:两个方法,而iOS11 里面 ,如果不是闲,相应的viewForSection 方法时,前面两个方法是无效的,

    有两个解决方案:

    一种是你在iOS11下不想使用Self-Sizing的话,可以通过:

    self.tableView.estimatedRowHeight = 0

    self.tableView.estimatedSectionHeaderHeight = 0

    self.tableView.estimatedSectionFooterHeight = 0

    这样的方式关闭。

    二种是你已经使用了Self-Sizing的话,可以通过:

    3.使用了Self-Sizing之后,Autolayout没生效!

    效果如图:

    可以看到,行高都变成默认的 44了,Autolayout并没有生效,没有自动动态展示内容啊~

    然后,发现了这样的一个问题,iOS11 之前,使用Self-Sizing的时候,

    tableView.rowHeight = UITableViewAutomaticDimension

    tableView的属性rowHeight是默认为UITableViewAutomaticDimension,所以我们使用的时候,很多会设置:

    tableView.estimatedRowHeight = 200

    这一句话,但是iOS11 中不行,前面有提到过。解决思路,当然是加上那句话啦。

    tableView.rowHeight = UITableViewAutomaticDimension

    tableView.estimatedRowHeight = 200

    两者同时出现,解决。

    4.关于安全区域Safe Area

    在这里提一点,iOS7 引入的 topLayoutGuide 和 bottomLayoutGuide 在iOS 11 中被废弃了,取而代之就是安全区域的概念,提供了两种方式safeAreaInsets 和 safeAreaLayoutGuide,即 insets 或者 layout guide。

    看图

    勾选Use Safe Area Layout Guides之后,Top Layout Guide 和 Bottom Layout Guide 被替换掉,变成 Safe Area。

    在这里有一个小Tip:

    安全区域针对于iPhoneX的尺寸,来说,效果是可行的, 但是放到8,8plus 上 面,就会莫名多一条分割线。所以,可以写一个小延展,来区别是哪个机型:

    extension UIDevice {

    public func isX() -> Bool {

                if UIScreen.main.bounds.height == 812 {

                         return true

                }

                return false

          }

    }

    具体参考如下:

    相似问题建议以iOS11正式版以及真机的测试为主,模拟器也有坑的啦。后续会跟进持续更新,,,

    相关文章

      网友评论

        本文标题:针对iOS11做出的App适配工作(干货分享,持续更新)

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