如何控制 UIScrollView 在 FirstResponder / 键盘变化时自动滚动?

问题描述 投票:0回答:1

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 位于键盘上方并使其可见。只需将其置于屏幕底部边缘上方即可。

这对我来说没有多大意义。

是否可以控制或禁用此自动滚动?

enter image description here

编辑:

我已创建

CustomScrollView
作为
UIScrollView
子类并覆盖了
scrollRectToVisible
。当调用
super.scrollRectToVisible
时,一切都像以前一样工作,但我可以设置一个断点来查看从哪里调用
scrollRectToVisible

调用堆栈显示了

scrollTextFieldToVisibleIfNecessary
中的方法
UITextField
,它使用
delegateShouldScrollToVisibleWhenBecomingFirstResponder

但是,UITextFileDelegate没有这样的方法/值,并且

scrollTextFieldToVisibleIfNecessary
也没有记录在任何地方。

所以,问题仍然是:如何禁用此行为?

ios swift uiscrollview
1个回答
0
投票

为了使此行为有意义,您需要将滚动视图的底部锚点限制为

view.keyboardLayoutGuide.topAnchor
。这样,滚动视图的框架将随着键盘的出现而调整,并且文本字段将滚动以显示在键盘上方。

这将满足在最简单的情况下出现键盘时显示第一响应者的需求,并且无需观察键盘事件和手动管理滚动视图。

我认为没有明确的方法来禁用此行为,但正如您所尝试的那样,一种方法是覆盖

scrollRectToVisible
并且不执行任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.