当我从一个文本字段点击到另一个文本字段时,它会滚动以便聚焦前一个 TextView 。我试图通过观察键盘更改通知来对此做出回应,并注意到 UIResponder.keyboardWillChangeFrameNotification
被调用两次。一次是第一个 TextView 仍然是第一响应者,一次是第二个 TextView 是第一响应者。
如果有人想对此进行尝试,我创建了最少的代码来重现我所看到的问题。启动一个新的单页应用程序并将其粘贴到 ViewController.swift 中。
import UIKit
class ViewController: UIViewController {
override func loadView() {
view = ScrollView()
}
}
class ScrollView: UIScrollView {
lazy var stack: UIStackView = {
let stack = UIStackView()
stack.backgroundColor = .systemGroupedBackground
stack.axis = .vertical
stack.spacing = 32
for number in 1...50 {
let textField = UITextField()
textField.text = "\(number)"
textField.borderStyle = .roundedRect
textField.heightAnchor.constraint(equalToConstant: 44).isActive = true
stack.addArrangedSubview(textField)
}
return stack
}()
init() {
super.init(frame: .zero)
addSubview(stack)
stack.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
stack.topAnchor.constraint(equalTo: topAnchor),
stack.bottomAnchor.constraint(equalTo: bottomAnchor),
stack.leadingAnchor.constraint(equalTo: leadingAnchor),
stack.trailingAnchor.constraint(equalTo: trailingAnchor),
stack.widthAnchor.constraint(equalTo: widthAnchor)
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
最佳答案
我不明白为什么 iOS 14 会这样,以及它是有意为之还是一个错误。我能够解决它的方法是子类化 UIScrollView
并覆盖 setContentOffset
什么都不做。这是我正在谈论的一个例子。
class ScrollView: UIScrollView {
func forceContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: animated)
}
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
// Intentially left blank to block the system from changing the content offset
}
}
这允许您手动确定何时滚动 ScrollView ,但它需要植入您想要自己保留的任何自动行为。
关于ios - 当 UIScrollView 滚动第一响应者查看时,如何修复 iOS 14 中的错误行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64733440/