2010-06-29 36 views
21

的“太长;没有读”版本:有没有办法讲UITextFieldbecomeFirstResponder时禁用UIScrollView自动滚动行为?不需要自动滚动使用的UIScrollView和UITextFields作为子视图

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

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

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

但是,当滚动视图为“自动滚动”时,如在将滚动视图告知scrollRectToVisible:animated:时,不调用用于减速的滚动视图委托方法。将新创建的页面滚动到视图中而无需用户的参与,或者当用户点击UIPageControl时,我使用此方法。

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

我认为这是将表格视图单元格中的文本字段(因为表视图是滚动视图子类)时使用的行为。如果您设置了一个小型测试应用程序,包含表格视图和表格单元格中的文本字段,如果键盘在成为第一个响应者时会隐藏表格视图单元格,表格视图会自动将其滚动为可见。

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

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

我在另一个测试的应用程序,把文本字段作为滚动视图的直接子视图(无视图控制器或容器视图)测试,同样的情况。如果您告诉屏幕外的文本字段成为第一响应者,滚动视图会自动为您滚动。

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

然后,如果我用摸我的手指视图(不刷卡,甚至移动),滚动视图跳回到第一页。

我目前的工作围绕这一切的愚蠢自动滚动的行为是使用一个NSTimer来确定何时更新的第一个响应者。

我使用scrollRectToVisible:animated,然后0.3秒后,打电话给我的方法来更新文本字段是第一个响应者做手工滚动代码。 (0。3秒是试验和错误,试图看出哪个时间似乎是允许动画的最小时间,但仍然足够长,不会导致与scrollview的冲突。

正如你可以看到,这是不优雅,并有可能打破。

当告诉UITextFieldbecomeFirstResponder时,有什么办法可以禁用UIScrollView的自动滚动行为吗?

回答

0

不回答你的问题,但它应该解决这个问题:

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

在发布我的问题后,我确实查看了此方法。最初,我认为它会解决问题,所以我删除了我的计时器代码,并将firstrResponder业务放在此方法中。但是当你反复快速地点击页面控件时,滚动视图会以无穷的方式跳转,因为在动画停止和被告知成为第一响应者的文本字段之间没有足够长的延迟......不幸的是,定时器做得更好。 – Jasarien 2010-06-29 13:57:34

5

呼叫becomeFirstResponder,然后向右走,设置了滚动到其当前位置的contentOffset ..

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

这很干净,谢谢。 – 2013-04-24 12:25:05

+0

它的工作,如果你还叫setContentOffset上的tableview从文本框 – pablobart 2013-09-11 18:34:29

+0

有时它的工作原理重写becomeFirstResponder方法,而不是在细胞上的tableView顶部 – 2015-12-19 07:33:28

相关问题