iOS 11如何从UITableView或UIScrollView获取visibleHeight和contentInset

8

iOS 10之前

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

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

iOS 11

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

经过一些调试,我发现顶部衬垫是0.0,而不是我的导航栏高度。

2个回答

7

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

// obj-c
if (@available(iOS 11.0, *)) {
  [tableView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

// swift
if #available(iOS 11.0, *) {
  tableView.contentInsetAdjustmentBehavior = .never
}

7

iOS 11和UIScrollViewContentInsetAdjustmentBehavior

iOS 11引入了UIScrollViewContentInsetAdjustmentBehavior,导致我无法获得正确的contentInset。更多信息请参见以下链接:

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 来获取最终值。 - Daniel Wood
我注意到这在实践中不适用于顶部插图。你必须添加它们。你试过了吗? - zirinisp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接