现在是:
广告热线:  |  设为首页 | 加入收藏
登陆用户名:
密码:
您现在的位置黑龙江财经网 > 科技 > >正文内容

博客 - CocoaChina

来源: 发布时间:2020-04-29 04:05:25 阅读:-

一.bug展示

Xcode 升级到 版本后,公司中的项目运行到iOS11的设备上出现了一个UI Bug,原来自动适配tableview的内间距失效了. 很显然,tableView有了额外的内边距.代码运行到之前的环境上是没问题的,可用Xcode9一编译,再跑到iOS11上就会出现问题...

二.问题产生原因

先贴一段设置tableView的代码

private func setupTableView() { tableView = UITableView() tableView.frame = view.bounds tableView.dataSource = self tableView.delegate = self tableView.backgroundColor = UIColor.red extendedLayoutIncludesOpaqueBars = true; automaticallyAdjustsScrollViewInsets = false; // 设置tableView的内边距(能够显示出导航栏和tabBar下覆盖的内容) tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0) // 设置内容指示器(滚动条)的内边距 tableView.scrollIndicatorInsets = tableView.contentInset } 关于extendedLayoutIncludesOpaqueBars和automaticallyAdjustsScrollViewInsets

这两个属性属于UIViewController 默认情况下extendedLayoutIncludesOpaqueBars = false 扩展布局不包含导航栏 默认情况下automaticallyAdjustsScrollViewInsets = true 自动计算滚动视图的内容边距 但是,当 导航栏 是 不透明时,而tabBar为透明的时候,为了正确显示tableView的全部内容,需要重新设置这两个属性的值,然后设置contentInset(参考代码). 上面的代码逻辑没有问题,但是放到iOS11 上为啥错了呢? 找了半天,点开了automaticallyAdjustsScrollViewInsets 这个属性,发现这个属性在iOS11过期了,如图:

在OC的声明中,这个属性是这样的: @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(),tvos()); // Defaults to YES 这说明在iOS11 中, UIViewController的automaticallyAdjustsScrollViewInsets属性已经不再使用,我们需要使用UIScrollView的 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 三.开始适配

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;

(正文已结束)

推荐阅读:中华创投网

免责声明及提醒:此文内容为本网所转载企业宣传资讯,该相关信息仅为宣传及传递更多信息之目的,不代表本网站观点,文章真实性请浏览者慎重核实!任何投资加盟均有风险,提醒广大民众投资需谨慎!

网站简介 - 联系我们 - 营销服务 - 老版地图 - 版权声明 - 网站地图
Copyright.2002-2019 黑龙江财经网 版权所有 本网拒绝一切非法行为 欢迎监督举报 如有错误信息 欢迎纠正