【问题标题】:Unwanted automatic scrolling with UIScrollView and UITextFields as subviews使用 UIScrollView 和 UITextFields 作为子视图的不需要的自动滚动
【发布时间】:2011-03-09 13:56:04
【问题描述】:

“太长了;没读过”版本:当告诉UITextFieldbecomeFirstResponder 时,有什么办法可以禁用UIScrollView 的自动滚动行为?

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

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

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

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

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

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

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

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

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

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

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

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

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

如您所见,这并不优雅,而且很可能会崩溃。

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

【问题讨论】:

    标签: iphone scroll uiscrollview uitextfield first-responder


    【解决方案1】:

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

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

    【讨论】:

    • 如果您在 tableview 上调用 setContentOffset 覆盖 textfield 中的 becomeFirstResponder 方法,它也可以工作
    • 有时可以,但不适用于tableView顶部的单元格
    • 对我来说,它在集合视图中工作,除了第一个单元格。让我们看看是否有人找到了一个完整的解决方案,现在总比没有好。
    【解决方案2】:

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

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

    【讨论】:

    • 我在发布问题后确实研究了这种方法。最初我认为它会解决问题,所以我删除了我的计时器代码,并将 firstrResponder 业务放在这个方法中。但是当您反复快速地点击页面控件时,滚动视图会随机跳动,因为在动画停止和文本字段被告知成为第一响应者之间没有足够长的延迟......遗憾的是,计时器做得更好.
    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多