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的主要内容,如果未能解决你的问题,请参考以下文章