ios - 当 UIScrollView 滚动第一响应者查看时,如何修复 iOS 14 中的错误行为?

标签 ios swift uiscrollview ios14 first-responder

当我从一个文本字段点击到另一个文本字段时,它会滚动以便聚焦前一个 TextView 。我试图通过观察键盘更改通知来对此做出回应,并注意到 UIResponder.keyboardWillChangeFrameNotification被调用两次。一次是第一个 TextView 仍然是第一响应者,一次是第二个 TextView 是第一响应者。
Scroll Problems
如果有人想对此进行尝试,我创建了最少的代码来重现我所看到的问题。启动一个新的单页应用程序并将其粘贴到 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/

相关文章:

objective-c - 推送 View 和 viewWillAppear 之间的顺序是什么?

ios - 收据验证失败时最好的方法是什么?

objective-c - Objective C block 作为异步回调和 BAD ACCESS

ios - 当我将 [<object> description] 作为参数传递时,自定义 NSLog 生成错误

swift - 为什么类中不支持类存储属性?

c - 将 swift 字符串传递给 c 函数 char *

ios - 在页面之间隐藏时移动到 ScrollView 中的特定页面 - iOS

ios - 从 Objective-C 到 swift 的 FBSDKLoginManager 代码

ios - 为什么 UITableView 的内容大小会变化

ios - 在 uiscrollview 中滑动不能正常工作