适配iOS11--contentInsetAdjustmentBehavior

一.bug展示

Xcode 升级到 9.0beta版本后,公司中的项目运行到iOS11的设备上出现了一个UI Bug,就像下面这种情况.

iOS11 模拟器

很显然,tableView有了额外的内边距.代码运行到之前的环境上是没问题的,可用Xcode9一编译,再跑到iOS11上就会出现这么严重的问题...

二.问题产生原因

先贴一段设置tableView的代码

private func setupTableView() {
        tableView = UITableView()
        tableView.frame = view.bounds
        tableView.dataSource = self
        tableView.delegate = self
        tableView.backgroundColor = UIColor.red
        // 公司的项目中导航栏是不透明的,所以需要加上这两行代码,我们自己来计算scrollView的内边距
        extendedLayoutIncludesOpaqueBars = true;
        automaticallyAdjustsScrollViewInsets = false;
        // 设置tableView的内边距(能够显示出导航栏和tabBar下覆盖的内容)
        tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0)
        // 设置内容指示器(滚动条)的内边距
        tableView.scrollIndicatorInsets = tableView.contentInset
}

关于extendedLayoutIncludesOpaqueBarsautomaticallyAdjustsScrollViewInsets

  • 这两个属性属于UIViewController
  • 默认情况下extendedLayoutIncludesOpaqueBars = false 扩展布局不包含导航栏
  • 默认情况下automaticallyAdjustsScrollViewInsets = true 自动计算滚动视图的内容边距
  • 但是,当 导航栏不透明时,而tabBar为透明的时候,为了正确显示tableView的全部内容,需要重新设置这两个属性的值,然后设置contentInset(参考代码).

上面的代码逻辑没有问题,但是放到iOS11 上为啥错了呢?
找了半天,点开了automaticallyAdjustsScrollViewInsets 这个属性,发现这个属性在iOS11过期了,如图:

automaticallyAdjustsScrollViewInsets.png

在OC的声明中,这个属性是这样的:
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES
这说明在iOS11 中, UIViewControllerautomaticallyAdjustsScrollViewInsets属性已经不再使用,我们需要使用UIScrollViewcontentInsetAdjustmentBehavior 属性来替代它.

关于contentInsetAdjustmentBehavior

@available(iOS 11.0, *)
public enum UIScrollViewContentInsetAdjustmentBehavior : Int {

    case automatic // Similar to .scrollableAxes, but will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewContentInset = YES inside a navigation controller, regardless of whether the scroll view is scrollable

    case scrollableAxes // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)

    case never // contentInset is not adjusted

    case always // contentInset is always adjusted by the scroll view's safeAreaInsets
}

UIScrollViewContentInsetAdjustmentBehavior 是一个枚举类型,值有以下几种:

  • automaticscrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
  • scrollableAxes 自动计算内边距.
  • never不计算内边距
  • always 根据safeAreaInsets 计算内边距
    很显然,我们这里要设置为 never

三.开始适配

swift 中

private func setupTableView() {
        tableView = UITableView()
        tableView.frame = view.bounds
        tableView.dataSource = self
        tableView.delegate = self
        tableView.backgroundColor = UIColor.red
        
        extendedLayoutIncludesOpaqueBars = true;
        if #available(iOS 11.0, *) {
            tableView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false;
        };
        tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0)
        tableView.scrollIndicatorInsets = tableView.contentInset
}

OC 中


self.extendedLayoutIncludesOpaqueBars = YES;
if (@available(iOS 11.0, *)) {
        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
        self.automaticallyAdjustsScrollViewInsets = NO;
}
_tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);
_tableView.scrollIndicatorInsets = _tableView.contentInset;

推荐阅读更多精彩内容

  • 适配iOS11 🍎苹果官方文档🍎苹果官方视频为了挣钱...哦😯不是,为了广大中国的开发者,苹果官方文档出了好多中文...
    philiha阅读 1,009评论 1 50
  • 前言 苹果WWDC开发者大会上,终于发布了大家期待已久的iOS 11,有些新特性功能确实出人意料。不过大的方面苹果...
    Mr_Say_Yes阅读 2,905评论 6 15
  • 有种后知后觉的感觉,�iOS11已经出来半个多月了,本来觉得不需要做太多的适配,我把适配的重点放到了新出的机型iP...
    Leesim阅读 2,446评论 0 10
  • 灯草生活在一个很美丽的森林里,周围有自由的风,清新的空气,生机盎然~许许多多的小动物和平而又开心的生活在这里,因为...
    帆明阅读 367评论 2 0
  • 老爸今年55岁,他的老同学见到他,都是捶胸顿足:“方某人,你怎么一点都不变老哟?!”确实,作为一个长期从事体力劳动...
    主妇方知阅读 322评论 0 0
  • 在我们家乡嵊州有一句方言叫 “罪过蟒,亏了(方言:出入)个娘!”,但凡嵊州人都知道,这是非常可怜,吃了亏的意思。可...
    肺话连篇阅读 611评论 0 2
  • 1. 安装Ruby 1.1 安装 Windows10,64位操作系统。在Downloads里面下载Ruby 2.3...
    Philippian阅读 1,299评论 0 1
  • 累了? 还需要肩膀吗? 陌生了? 觉得无所谓了? 生活,只是追求吗? 往往越想马上得到的某些东西。 就会有些慢慢的...
    姬静龙阅读 119评论 0 0