TL;博士
这是 Xcode 14 和 iOS 16 中的新功能吗?现在,当 ScrollView 内的视图变为firstReponder 并且出现键盘时,
UIScrollView
会自动滚动?在使用早期版本的 Xcode 和 iOS 处理其他 iOS 项目时,我从未遇到过这种行为。这可以控制或停用吗?
详情:
在新的 iOS 项目上使用 Xcode 14.0.1 时,我注意到当内容视图成为第一响应者时,
UIScrollView
现在会自动滚动。
看看这个例子。我创建了一个新项目,向 ViewController 添加了一个 ScrollView,并在其中放置了 12 个子视图以填充一些内容。子视图编号12 另外还有一个
UITextField
。可以使用顶部按钮切换此文本字段的firstResponder 状态。
点击按钮时,TextField 变为firstResponder,ScrollView 会自动向上滚动。但是,还不足以使 TextField 位于键盘上方并使其可见。只需将其置于屏幕底部边缘上方即可。
这对我来说没有多大意义。
是否可以控制或禁用此自动滚动?
编辑:
我已创建
CustomScrollView
作为 UIScrollView
子类并覆盖了 scrollRectToVisible
。当调用 super.scrollRectToVisible
时,一切都像以前一样工作,但我可以设置一个断点来查看从哪里调用 scrollRectToVisible
。
调用堆栈显示了
scrollTextFieldToVisibleIfNecessary
中的方法 UITextField
,它使用 delegateShouldScrollToVisibleWhenBecomingFirstResponder
但是,UITextFileDelegate没有这样的方法/值,并且
scrollTextFieldToVisibleIfNecessary
也没有记录在任何地方。
所以,问题仍然是:如何禁用此行为?
为了使此行为有意义,您需要将滚动视图的底部锚点限制为
view.keyboardLayoutGuide.topAnchor
。这样,滚动视图的框架将随着键盘的出现而调整,并且文本字段将滚动以显示在键盘上方。
这将满足在最简单的情况下出现键盘时显示第一响应者的需求,并且无需观察键盘事件和手动管理滚动视图。
我认为没有明确的方法来禁用此行为,但正如您所尝试的那样,一种方法是覆盖
scrollRectToVisible
并且不执行任何操作。