iOS 11 从 UITableView 或 UIScrollView 获取 visibleHeight 和 contentInset

Posted

技术标签:

【中文标题】iOS 11 从 UITableView 或 UIScrollView 获取 visibleHeight 和 contentInset【英文标题】:iOS 11 getting visibleHeight and contentInset from a UITableView or UIScrollView 【发布时间】: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,而不是导航栏的高度。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于iOS 11 从 UITableView 或 UIScrollView 获取 visibleHeight 和 contentInset的主要内容,如果未能解决你的问题,请参考以下文章

iOS UI控件7(UITableView)

iOS开发UI篇—UITableview控件使用小结

iOS开发UI篇—UITableview控件基本使用

Objective-C UI之UITableView详解

iOS开发UI篇—实现UITableview控件数据刷新

从 iOS 11 搜索控制器导航时不需要的 UITableView 重新加载动画