学无止境在iOS开发的道路上越走越远ios开发学习

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

2017-09-19  本文已影响365人  CX_cxy

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

上一篇下一篇

猜你喜欢

热点阅读