Jas*_*ien 25 iphone scroll uiscrollview uitextfield first-responder
该"太长;没有读"版本:有没有什么办法来禁用自动滚动行为UIScrollView
讲的时候UITextField
到becomeFirstResponder
?
我有一个启用分页的滚动视图和几个视图作为子视图,每个子视图由其自己的视图控制器控制.每个子视图都有一个UITextField.
要求是当页面滚动到视图中时,它的文本字段应该成为第一响应者.
使用手指滑动滚动时这很好 - 我使用滚动视图委托方法scrollViewDidEndDecelerating:
知道滚动停止和页面在视图中时,我可以告诉文本字段成为第一响应者.
但是,当滚动视图被"自动滚动"时,如在告知scrollRectToVisible:animated:
滚动视图时,不调用用于减速的滚动视图委托方法.在将新创建的页面滚动到视图中而没有用户的交互,或者用户点击时,我使用此方法UIPageControl
.
我的解决方案是在告诉它滚动到视图之前简单地设置文本字段的第一个响应者状态 - 但似乎告诉滚动视图中的文本字段成为第一个响应者会导致滚动视图自动将其滚动到视图中.
我假设这是在表视图单元格中放置文本字段时使用的行为(因为表视图是滚动视图子类).如果您设置一个小型测试应用程序,具有表格视图和表格单元格中的文本字段,如果键盘在成为第一响应者时会遮挡表格视图单元格,则表格视图将自动滚动它以使其可见.
但是,我不明白为什么在我的示例中出现这种情况,我没有使用表视图 - 只是一个简单的滚动视图.
我还要提一下,我的滚动视图已禁用垂直滚动,只能水平滚动.
我已经在另一个测试应用程序中进行了测试,该应用程序将文本字段作为scrollview的直接子视图(没有视图控制器或容器视图),同样的情况发生.如果您告诉屏幕外的文本字段成为第一响应者,则滚动视图会自动为您滚动它.
这通常不会成为问题,但似乎搞砸了滚动视图的分页.当我用手指滚动时,每个视图都会反弹并正确居中.但是当我滚动一个矩形以使动画可见并告诉文本字段成为第一响应者时,滚动视图似乎与自身发生冲突,并且视图仅滚动到视图的一部分,并且不居中.
然后,如果我用手指触摸视图(不滑动,甚至移动),滚动视图会跳回到第一页.
我目前对所有这些愚蠢的自动滚动行为的解决方法是使用a NSTimer
来确定何时更新第一个响应者.
我在代码中使用手动滚动,scrollRectToVisible:animated
然后在0.3秒后,调用我的方法将文本字段更新为第一响应者.(0.3秒是试验和错误,试图看哪,这似乎是允许动画的最小时间,但仍然足够长,不会导致与scrollview的冲突.
正如你所看到的,这并不优雅,而且可能会破裂.
有没有什么办法来禁用自动滚动行为UIScrollView
讲的时候UITextField
到becomeFirstResponder
?
调用becomeFirstResponder,然后立即将scrollview的contentOffset设置为其当前位置.
[textField becomeFirstResponder];
[scrollview setContentOffset:scrollview.contentOffset animated:NO];
Run Code Online (Sandbox Code Playgroud)
不是您问题的答案,但它应该可以解决问题:
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
// Make the text field first responder...
}
Run Code Online (Sandbox Code Playgroud)