【发布时间】:2011-03-09 13:56:04
【问题描述】:
“太长了;没读过”版本:当告诉UITextField 到becomeFirstResponder 时,有什么办法可以禁用UIScrollView 的自动滚动行为?
我有一个启用分页的滚动视图和几个视图作为子视图,每个子视图都由它自己的视图控制器控制。每个子视图都有一个 UITextField。
要求当页面滚动到视图中时,它的文本字段应该成为第一响应者。
这在使用手指滑动滚动时很好——我使用滚动视图委托方法scrollViewDidEndDecelerating: 来知道滚动停止并且页面在视图中时,我可以告诉文本字段成为第一响应者。
然而,当滚动视图被“自动滚动”时,就像将滚动视图告诉scrollRectToVisible:animated: 时一样,用于减速的滚动视图委托方法不会被调用。当在没有用户交互的情况下将新创建的页面滚动到视图中时,或者当用户点击UIPageControl 时,我会使用此方法。
我的解决方案是在告诉它滚动到视图之前简单地设置文本字段的第一响应者状态 - 但似乎告诉滚动视图中的文本字段成为第一响应者会导致滚动视图自动滚动它进入视野。
我假设这是将文本字段放入表格视图单元格时使用的行为(因为表格视图是滚动视图子类)。如果您设置了一个小型测试应用程序,具有表格视图和表格单元格内的文本字段,如果键盘在成为第一响应者时会遮挡表格视图单元格,则表格视图将自动滚动以使其可见。
不过,我不明白为什么在我的示例中会出现这种行为,我没有使用表格视图 - 只是一个普通的滚动视图。
我还要提一下,我的滚动视图禁用了垂直滚动,只能水平滚动。
我在另一个测试应用程序中进行了测试,该应用程序将文本字段作为滚动视图的直接子视图(没有视图控制器或容器视图),并且发生了同样的情况。如果您告诉屏幕外的文本字段成为第一响应者,滚动视图会自动为您滚动。
这通常不会是一个问题,但它似乎搞砸了滚动视图的分页。当我用手指滚动时,每个视图都会反弹并正确居中。但是,当我滚动一个矩形以显示 动画 并告诉一个文本字段成为第一响应者时,滚动视图似乎与自身发生冲突,并且视图只是滚动到视图的一部分,并且没有居中。
然后,如果我用手指触摸视图(不是滑动,甚至移动),滚动视图就会跳回第一页。
我目前针对所有这些愚蠢的自动滚动行为的解决方法是使用NSTimer 来确定何时更新第一响应者。
我使用scrollRectToVisible:animated 在代码中手动滚动,然后在 0.3 秒后,调用我的方法将文本字段更新为第一响应者。 (0.3 秒是反复试验,试图看看哪个似乎是允许动画的最短时间,但仍然足够长,不会导致与滚动视图发生冲突。
如您所见,这并不优雅,而且很可能会崩溃。
有什么方法可以在将UITextField 告诉becomeFirstResponder 时禁用UIScrollView 的自动滚动行为?
【问题讨论】:
标签: iphone scroll uiscrollview uitextfield first-responder