2012-07-17 78 views
6

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

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

这很好,但如果表视图滚动到顶部,并且随着键盘滑落,我开始更改其内容嵌入,表视图滚动通过顶部,然后捕捉回顶部,导致奇怪的生涩的动画。我认为这是因为如果表视图滚动过顶部,那么更改contentInset会将contentOffset重置为表视图的顶部,这使得它变得很奇怪。

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

回答

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是在顶部或滚动经过上的插图不会改变。如果表格向下滚动一下并拖动,它将更改插入直到它到达顶部,然后停止更改它们,以便不会发生奇怪的闪烁。


编辑:想通了的根本原因我想我会更新这个,而不是见好就收解决方法。我在做的是在我的帧计算中混合一个CGAffineTransformMakeTranslation,根据Apple文档,这是一个很大的禁忌。当transform属性不是CGAffineTransformIdentity时,frame变得未定义,并且如果我滚动表视图并同时更改其内容插入,这会导致一些非常奇怪的行为。