适配iOS11 - UITableview UICollecti

作者: 臭码农 | 来源:发表于2017-08-01 16:49 被阅读17747次

最新iOS 11 & iPhone X适配方案传送门:10分钟适配 iOS11 & iPhoneX

发现问题

升级Xcode 9 + iOS 11后,发现原本没问题的collectionView和tableView像是中了风一样,头部刷新UI出现了错乱。
查阅发现 iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增contentInsetAdjustmentBehavior来替代它

关于 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 是一个枚举类型,值有以下几种:

-automatic 和scrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
-scrollableAxes 自动计算内边距.
-never不计算内边距
-always 根据safeAreaInsets 计算内边距

很显然,我们这里要设置为 never

开始适配

OC 中


        if (@available(iOS 11.0, *)){
            _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
            _tableView.contentInset = UIEdgeInsetsMake(0, 0, 49, 0);//导航栏如果使用系统原生半透明的,top设置为64
            _tableView.scrollIndicatorInsets = _tableView.contentInset;
        }

swift 中

        if #available(iOS 11.0, *) {
            tableView.contentInsetAdjustmentBehavior = .never
            tableView.contentInset = UIEdgeInsetsMake(0, 0, 49, 0)//导航栏如果使用系统原生半透明的,top设置为64
            tableView.scrollIndicatorInsets = tableView.contentInset
        }

凡是Scrollview 及 Scrollview子类都会有适配问题,整个工程使用了无数Scrollview的你心理阴影面积一定不小,别担心,其实可以一行代码解决问题:

// AppDelegate 进行全局设置
    if (@available(iOS 11.0, *)){
        [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }

终于又回归原来的效果啦

11.gif

更多代码可参考
https://github.com/XuYang8026/UniversalProject

以上属于臭码农原创,若有雷同属巧合,如有错误望指正,转载请标明来源和作者。
by:臭码农

相关文章

网友评论

  • 不必luo嗦:如果是加在collectionview上的刷新,出现刷新控件乱跳,该怎么处理?
  • 西叶lv:MJ3.15.1在iOS11下,上拉加载,触发7次,这个有遇到么?
    西叶lv:@臭码农 额?这个不是解决触发多次的错误吧?这个不是解决偏移量计算的跳页问题么?
    西叶lv:@臭码农 试过了,最开始用的这个,cell自适应会有写错误,记录在这里了--http://www.jianshu.com/p/1acdbfba7c49
    臭码农:@郝嘉律 self.tableView.estimatedRowHeight = 0;
    self.tableView.estimatedSectionHeaderHeight = 0;
    self.tableView.estimatedSectionFooterHeight = 0;
  • 西叶lv:// tableView这样设置
    if (@available(iOS 11.0, *)){
    _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    _tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);//导航栏如果使用系统原生半透明的,top设置为64
    _tableView.scrollIndicatorInsets = _tableView.contentInset;
    }

    // Masonry这样适配
    [selfObj.tableView mas_makeConstraints:^(MASConstraintMaker *make) {

    make.top.equalTo(view.mas_top).offset(64);
    make.left.equalTo(view.mas_left).offset(0);
    make.bottom.equalTo(view.mas_bottom).offset(0);
    make.right.equalTo(view.mas_right).offset(0);

    }];

    MJ上下拉和闲置时,才能不会遮住tableView,reload的时候也不会跳页
  • admirersuper:楼主想知道,你的下拉刷新效果有一个loading停留那么一点时间的过程,请问这个如何实现的?
    谢谢
    臭码农:@admirersuper 最新的MJ就是这个效果吧,你那什么效果?
  • 拿铁代码:看到GitHub上面 MJRefresh更新了 添加Xcode9 iPhoneX的适配,是不是我有福了然后不用折腾了?
  • bc3d3e66fba3:非常感谢你,看了你的文章,解决了我两天没有解决的问题,收藏了!:heart:
    空转风:@Super洁 在APPdelegate加入 if (@available(iOS 11.0, *)){
    [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
    完全没有用啊,该跑偏的还是跑偏啊?
    bc3d3e66fba3:@臭码农 可以啊,可以交流交流
    臭码农:@Super洁 那不妨加个好友 避免以后浪费更多的两天:smile:
  • 姜流儿96:Haiti is
  • 布袋的世界:tableView.contentInsetAdjustmentBehavior,这句话一定得升级为 xcode 9 才有吗?

    布袋的世界:@臭码农 谢啦!
    臭码农:@布袋的世界 对的
  • 郝嗨森:我在collectionView上加了头部刷新,每次刷新后collectionView都会往上滑动一段
  • 等一个最好的自己:自己的demo有问题,你首页跳到别的页面,在跳回来,下边会有一个大空白
    臭码农:问题已经修复,感觉是iOS11的bug导致self.view位置偏移,我兼容了一下,请更新~
    感谢你发现问题并通知我~
    臭码农:@等一个最好的自己 哦对,转场动画的问题,我马上修复,忘记修复这个了。。抱歉
  • 实在不想取名字:很赞 解决了大问题 :+1:
    臭码农:@南人在外 升级Xcode 9
    钱刀为:为什么// AppDelegate 进行全局设置
    if (@available(iOS 11.0, *)){
    [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }

    同样操作,编译就不过,说是 iOS名称@available(iOS 11.0, *)
  • 雪_晟:在基类是关掉两个属性就行了吧 self.extendedLayoutIncludesOpaqueBars = YES;
    self.automaticallyAdjustsScrollViewInsets = NO; 在把新的属性设置为never
    5cc65b734413:@雪_晟 我这边是Xcode调试iOS11的手机就会这样,把self.extendedLayoutIncludesOpaqueBars = YES;注释掉就正常了
    雪_晟:@kayessssss 我的没问题啊
    5cc65b734413:你是要做导航栏透明的效果吗
    self.extendedLayoutIncludesOpaqueBars = YES在iOS11下会出现控制器无法加载的情况
  • 张囧瑞:你好,请问我这边更新了之后只要 reloadData 之后 就会乱跳,也是跟这个问题有关系吗??但是我按照这个办法改了之后好像没有生效。
    臭码农:@张囧瑞 你在研究下吧,我这边设置属性就可以啊
    张囧瑞:@臭码农 会!但是我没有用mj的下拉框架。
    臭码农:@张囧瑞 下拉会乱跳吗
  • mengkeer:请问下,头部刷新大致出现了什么问题。因为我们的APP在iOS 11下好像没出现刷新上的UI bug,所以不知道要不要改下?
    臭码农:@陈_某_某 iOS 11增加新特性,跟Xcode没关系呀
    陈_某_某:这个问题是不是xcode8编译的包在iOS 11下就不会有这个问题?
    臭码农:会跳动,用MJ的都有这个问题吧,你再看看
  • Ko_Neko:我这边项目需求和你差不多,不过我是把TableView的第一行塞入一个WebView。高度计算倒是没有错。但是诡异的是每次reloadData后如果有WebView的Cell一部分或者全部不可见,那么再滚回去的时候WebView里的内容就会出现部分空白,像用橡皮擦掉了一样。但是高度没有变化。不知道是怎么回事…
    Ko_Neko:不好意思回复错地方了。。是回复另一篇计算WebView高度的文章的
  • 780647dcdf0e:活好不粘人:underage:
    小名叫别扭:@臭码农 我是不是发现了什么
    臭码农:我要全套:fist:

本文标题:适配iOS11 - UITableview UICollecti

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