使用UIScrollView和UITextField作为子视图进行不需要的自动滚动

时间:2010-06-29 11:17:06

标签: iphone scroll uiscrollview uitextfield first-responder

“太长了;没看过”版本:有没有办法在告诉UIScrollView UITextField时禁用becomeFirstResponder的自动滚动行为}?

我有一个启用分页的滚动视图和几个视图作为子视图,每个子视图由其自己的视图控制器控制。每个子视图都有一个UITextField。

要求是当页面滚动到视图中时,它的文本字段应该成为第一响应者。

使用手指滑动滚动时这很好 - 我使用滚动视图委托方法scrollViewDidEndDecelerating:来了解滚动停止和页面在视图中时,我可以告诉文本字段成为第一响应者。 / p>

但是,当滚动视图为“自动滚动”时,如将滚动视图告知scrollRectToVisible:animated:时,不会调用用于减速的滚动视图委托方法。在没有用户交互的情况下将新创建的页面滚动到视图中,或者当用户点击UIPageControl时,我使用此方法。

我的解决方案是在告诉它滚动到视图之前简单地设置文本字段的第一个响应者状态 - 但似乎告诉滚动视图中的文本字段成为第一个响应者会导致滚动视图自动滚动进入视野。

我认为这是在表视图单元格中放置文本字段时使用的行为(因为表视图是滚动视图子类)。如果您设置一个小型测试应用程序,具有表格视图和表格单元格中的文本字段,如果键盘在成为第一响应者时会遮挡表格视图单元格,则表格视图将自动将其滚动显示。 / p>

我不明白,为什么在我的示例中出现这种情况,我没有使用表视图 - 只是一个简单的滚动视图。

我还应该提一下,我的滚动视图已禁用垂直滚动,只能水平滚动。

我已经在另一个测试应用程序中进行了测试,该应用程序将文本字段作为滚动视图的直接子视图(没有视图控制器或容器视图),同样的情况发生。如果您告诉屏幕外的文本字段成为第一响应者,则滚动视图会自动为您滚动。

这通常不会成为问题,但似乎搞砸了滚动视图的分页。当我用手指滚动时,每个视图都会反弹并正确居中。但是当我将一个矩形滚动到带有动画并告诉文本字段成为第一响应者时,滚动视图似乎与自身发生冲突,并且视图仅滚动到视图的一部分,并且没有居中。

然后,如果我用手指触摸视图(不是滑动,甚至不移动),滚动视图会跳回到第一页。

我目前对所有这些愚蠢的自动滚动行为的解决方法是使用NSTimer来确定何时更新第一个响应者。

我使用scrollRectToVisible:animated在代码中手动滚动,然后在0.3秒后,调用我的方法将文本字段更新为第一响应者。 (0.3秒是试验和错误,试图看看哪个似乎是允许动画的最小时间,但仍然足够长,不会导致与滚动视图的冲突。

正如你所看到的,这并不优雅,很可能会破裂。

在告诉UIScrollViewUITextField时,有没有办法禁用becomeFirstResponder的自动滚动行为?

2 个答案:

答案 0 :(得分:6)

调用becomeFirstResponder,然后立即将scrollview的contentOffset设置为当前位置..

[textField becomeFirstResponder];
[scrollview setContentOffset:scrollview.contentOffset animated:NO];

答案 1 :(得分:0)

不是你问题的答案,但它应该解决问题:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
  // Make the text field first responder...
}