28

“太长;未读”版本:有没有办法禁用UIScrollView告诉 a 时UITextField的自动滚动行为becomeFirstResponder

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

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

这在使用手指滑动滚动时很好——我使用滚动视图委托方法scrollViewDidEndDecelerating:来知道滚动停止并且页面在视图中时,我可以告诉文本字段成为第一响应者。

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

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

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

但是,我不明白为什么在我的示例中会出现这种行为,我没有使用表格视图 - 只是一个普通的滚动视图。

我还应该提到我的滚动视图禁用了垂直滚动,并且只水平滚动。

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

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

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

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

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

如您所见,这并不优雅,并且可能会中断。

有什么方法可以禁用UIScrollView告诉 a 时UITextField的自动滚动行为becomeFirstResponder吗?

4

2 回答 2

7

调用 becomeFirstResponder,然后立即将滚动视图的 contentOffset 设置为其当前位置..

[textField becomeFirstResponder];
[scrollview setContentOffset:scrollview.contentOffset animated:NO];
于 2012-10-29T03:25:34.870 回答
0

不是您问题的答案,但它应该可以解决问题:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
  // Make the text field first responder...
}
于 2010-06-29T13:21:37.007 回答