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

伴随着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正式版以及真机的测试为主,模拟器也有坑的啦。后续会跟进持续更新,,,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文为作者原创,未经作者允许不得转载。该文同时发表在腾讯bugly公众号:https://mp.weixin.qq...
    sonialiu阅读 101,712评论 74 283
  • iOS 11 为整个生态系统的 UI 元素带来了一种更加大胆、动态的新风格。 本文介绍iOS11中在UI方面做了哪...
    阿凡提说AI阅读 609评论 0 1
  • 前言 苹果WWDC开发者大会上,终于发布了大家期待已久的iOS 11,有些新特性功能确实出人意料。不过大的方面苹果...
    Mr_Say_Yes阅读 3,390评论 6 15
  • 地铁转乘的时候 很多人选择扶梯,或许是累了,也可能是习惯了,省事省力,亦或许是为了抽空看看手机…… 每逢有机会用到...
    Judy970606阅读 284评论 0 0
  • 昨天的争吵一直在我脑海浮现,包括昨晚睡觉之前我都在想着如何解决问题,所以我想解决这个问题的决心很大,同时我也觉知到...
    Hi_张阅读 162评论 0 0