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

时间:2012-07-17 04:38:41

标签: iphone ios uitableview uiscrollview

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

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

这很好用,但是如果表格视图滚动到顶部并且当键盘向下滑动时我开始更改其内容插入,则表格视图滚过顶部然后快速回到顶部导致奇怪的生涩动画。我想这是因为如果表视图滚动到顶部,更改contentInset会将contentOffset重置为表视图的顶部,这会使其行为异常。

有没有人知道如何更改滚动视图的contentInset而不更改其contentOffset?

1 个答案:

答案 0 :(得分:7)

我设法通过一个小的解决方法使一切工作完美。我刚刚这样做了:

// 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位于顶部或滚动到顶部,则不会更改insets。如果表格向下滚动并拖动,它会更改插入物直到它到达顶部,然后它会停止更改它们,以便不会发生奇怪的闪烁。


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