更改 UITableView 的 contentInset 而不更改其 contentOffset?

Posted

技术标签:

【中文标题】更改 UITableView 的 contentInset 而不更改其 contentOffset?【英文标题】:Change UITableView's contentInset without changing its contentOffset? 【发布时间】:2012-07-17 04:38:41 【问题描述】:

我想在 iPhone 上创建一个类似于 Apple 的 Messages 应用程序的 UI。我有一个表格视图和它下面的文本字段。当我选择文本字段时,我会在键盘向上滑动时为表格视图的 contentInset 设置动画,以便内容显示在键盘上方。

我有一些代码使用平移手势识别器来检测用户何时向下滚动表格视图并在发生这种情况时向下动画键盘(如果您看到 Apple 的消息应用程序,它具有相同的功能来关闭键盘。您在表格视图上向下滚动,当您的手指滑过文本字段时,键盘随之下降)。

这很好用,但是如果表格视图滚动到顶部并且我在键盘向下滑动时开始更改其内容插图,表格视图会滚动到顶部然后又回到顶部,从而导致奇怪的生涩动画。我认为这是因为如果表格视图滚动到顶部,更改 contentInset 会将 contentOffset 重置为表格视图的顶部,这会使其表现得很奇怪。

有谁知道如何在不更改 contentOffset 的情况下更改滚动视图的 contentInset?

【问题讨论】:

【参考方案1】:

我设法通过一个小变通方法使一切正常工作。我刚刚这样做了:

// in a method that gets repeatedly called as the pan gesture recognizer changes
if([tableView contentOffset].y > 0) 
    UIEdgeInsets insets = [tableView contentInsets];
    inset.bottom = currentKeyboardHeight;
    [tableView setContentInset:inset];

这样,如果 contentOffset 位于最顶部或滚动到顶部,则不会更改插图。如果表格向下滚动并拖动,它会更改插图直到它到达顶部,然后停止更改它们,这样就不会发生奇怪的闪烁。


编辑: 找出根本原因,并认为我会更新它,而不是仅仅离开解决方法。我正在做的是在我的帧计算中间混合CGAffineTransformMakeTranslation,根据 Apple 文档,这是一个很大的禁忌。当transform 属性不是CGAffineTransformIdentity 时,frame 变为未定义,如果我滚动表格视图并同时更改其内容插图,这会导致一些非常奇怪的行为。

【讨论】:

以上是关于更改 UITableView 的 contentInset 而不更改其 contentOffset?的主要内容,如果未能解决你的问题,请参考以下文章

更改分组 UITableView 的背景

UITableView 部分标题更改当前标题的样式

无法在 iPad UI 中更改 UITableView 的背景颜色

如何通过单击按钮更改 UITableView 的内容?

如何更改 UITableView 背景图像的大小?

如何更改 UITableView 中文本的位置?