【问题标题】:iOS 11 getting visibleHeight and contentInset from a UITableView or UIScrollViewiOS 11 从 UITableView 或 UIScrollView 获取 visibleHeight 和 contentInset
【发布时间】:2017-09-06 15:36:37
【问题描述】:

iOS 10 之前

如果我想获得表格或滚动视图的可见高度,我必须从表格视图的高度中减去顶部和底部插图

let tableView = ....
let height = tableView.frame.size.height - tableView.contentInset.top - tableView.contentInset.bottom

iOS 11

不幸的是,在 iOS 11 上使用上述方法,我没有得到正确的值。

经过一些调试后,我意识到顶部插图是 0.0,而不是导航栏的高度。

【问题讨论】:

    标签: ios swift ios11 swift4


    【解决方案1】:

    iOS 11 和 UIScrollViewContentInsetAdjustmentBehavior

    我没有得到正确的 contentInset,因为 iOS 11 引入了 UIScrollViewContentInsetAdjustmentBehavior。更多信息可以在以下链接中找到:

    https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior

    由于引入了 UIScrollViewContentInsetAdjustmentBehavior,我们必须考虑到 adjustedContentInset 属性并将其添加到 contentInset。

    以上代码需更新为:

    let visibleHeigh: CGFloat
    if #available(iOS 11, *) {
      visibleHeight = tableView.frame.size.height - (tableView.contentInset.top + tableView.adjustedContentInset.top) - (tableView.contentInset.bottom + tableView.adjustedContentInset.bottom)
    } else {
      visibleHeight = tableView.frame.size.height - tableView.contentInset.top - tableView.contentInset.bottom
    }
    

    【讨论】:

    • adjustedContentInset 的文档说“然后将安全区域插入添加到 contentInset 属性中的值以获得此属性的最终值。”对我来说,这表明我们应该使用adjustedContentInset 作为最终值。
    • 我注意到这在实践中不适用于顶部插图。你必须添加它们。你试过了吗?
    【解决方案2】:

    如果您希望滚动视图的内容插入不受“adjustedContentInset”的影响,您可以使用以下代码禁用这种不可预知的行为:

    // obj-c
    if (@available(iOS 11.0, *)) {
      [tableView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
    
    // swift
    if #available(iOS 11.0, *) {
      tableView.contentInsetAdjustmentBehavior = .never
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2013-09-26
      • 1970-01-01
      • 2018-03-03
      相关资源
      最近更新 更多