gpt4 book ai didi

iphone - 使用 UIScrollView 和 UITextFields 作为 subview 进行不需要的自动滚动

转载 作者:行者123 更新时间:2023-12-03 18:17:21 25 4
gpt4 key购买 nike

“太长;没有阅读”版本:在告诉 UITextField 时,有什么方法可以禁用 UIScrollView 的自动滚动行为>成为FirstResponder

我有一个启用分页的 ScrollView 和多个作为 subview 的 View ,每个 subview 都由其自己的 View Controller 控制。每个 subview 都有一个 UITextField。

要求是,当页面滚动到 View 中时,其文本字段应成为第一响应者。

当使用手指滑动滚动时,这很好——我使用 ScrollView 委托(delegate)方法 scrollViewDidEndDecelerating: 来知道滚动何时停止并且页面处于 View 中,我可以告诉文本字段变成第一响应者。

但是,当 ScrollView “自动滚动”时,例如告诉 ScrollView scrollRectToVisible:animated: 时,不会调用用于减速的 ScrollView 委托(delegate)方法。当在没有用户交互的情况下将新创建的页面滚动到 View 中,或者当用户点击 UIPageControl 时,我使用此方法。

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

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

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

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

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

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

然后,如果我用手指触摸 View (而不是滑动,甚至移动), ScrollView 会跳回第一页。

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

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

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

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

最佳答案

调用becomeFirstResponder,然后立即将scrollview的contentOffset设置为其当前位置..

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

关于iphone - 使用 UIScrollView 和 UITextFields 作为 subview 进行不需要的自动滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3140109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com