为什么我的功能根据键盘高度调整视图的行为不正常?

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

我正在尝试重新创建一个Facebook注册页面进行练习;我的viewController的设置如下:1)顶部的个人资料图像容器,2)电子邮件文字栏位3)密码文字栏位4)确认密码文本字段

为了解决键盘阻止“确认密码”字段的问题,我使用了以下侦听器。

问题是,用户第一次单击文本字段进行键入(无论是哪个文本字段)时,屏幕都将移动得太远,以至于顶部的电子邮件文本字段最终超出了顶部的屏幕大小。但是,当我关闭键盘并重新单击任何文本字段时,它会按预期方式上升:仅直到顶部文本字段到达屏幕顶部为止。

我找不到其他原因,即使重新编写了一些代码后,它仍然存在。

我的ViewController设置:

class ViewController: UIViewController {


@objc func dismissKeyboard() {
        view.endEditing(true)
}

let imageContainer: UIView = {
   let v = UIView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.backgroundColor = .red
    return v
}()

let emailTF: UITextField = {
   let tf = UITextField()
    tf.translatesAutoresizingMaskIntoConstraints = false
    tf.placeholder = "EMAIL"
    return tf
}()

let passwordTF: UITextField = {
   let tf = UITextField()
    tf.translatesAutoresizingMaskIntoConstraints = false
    tf.placeholder = "Password"
    return tf
}()


let confirmPasswordTF: UITextField = {
   let tf = UITextField()
    tf.translatesAutoresizingMaskIntoConstraints = false
    tf.placeholder = "Confirm password"
    return tf
}()


@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y == 0 {
            self.view.frame.origin.y -= keyboardSize.height
        }
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if self.view.frame.origin.y != 0 {
        self.view.frame.origin.y = 0
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .lightGray

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
       NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

    view.addSubview(imageContainer)
    view.addSubview(emailTF)
    view.addSubview(passwordTF)
    view.addSubview(confirmPasswordTF)

            NSLayoutConstraint.activate([

            imageContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            imageContainer.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.275),
            imageContainer.widthAnchor.constraint(equalTo: view.heightAnchor),
            imageContainer.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),

            emailTF.topAnchor.constraint(equalTo: imageContainer.bottomAnchor),
            emailTF.heightAnchor.constraint(equalToConstant: 100),
            emailTF.widthAnchor.constraint(equalToConstant: 200),
            emailTF.centerXAnchor.constraint(equalTo: view.centerXAnchor),

            passwordTF.topAnchor.constraint(equalTo: emailTF.bottomAnchor, constant: 20),
            passwordTF.heightAnchor.constraint(equalToConstant: 100),
            passwordTF.widthAnchor.constraint(equalToConstant: 200),
            passwordTF.centerXAnchor.constraint(equalTo: view.centerXAnchor),

            confirmPasswordTF.topAnchor.constraint(equalTo: passwordTF.bottomAnchor, constant: 20),
            confirmPasswordTF.heightAnchor.constraint(equalToConstant: 100),
            confirmPasswordTF.widthAnchor.constraint(equalToConstant: 200),
            confirmPasswordTF.centerXAnchor.constraint(equalTo: view.centerXAnchor),

        ])

    let tapToDismissKeyboard: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
    view.addGestureRecognizer(tapToDismissKeyboard)

    }


}

我非常感谢您为我可以采取的纠正措施提供帮助。

swift
1个回答
0
投票

似乎是here和其他SO问题引起的已知问题。

要提出两点:-

1)使用UIResponder.keyboardFrameEndUserInfoKey代替UIResponder.keyboardFrameBeginUserInfoKey

if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

keyboardWillShow()

2)这样做,您将获得键盘包括工具栏的总高度。意思是:

但是,当我关闭键盘并重新单击任何文本字段时,按预期上升:仅直到顶部文本字段达到以下位置的顶部屏幕。

这是一种越野车行为,在其中您得到不正确的高度,但不包括工具栏和:

问题是,用户第一次点击文本字段来类型(无论是哪一种),屏幕都向上移动太远,以至于顶部的电子邮件文本字段最终超出了屏幕大小顶部。

这实际上是具有实际高度的预期行为。您可以计算工具栏的高度,并从该高度中减少它以实现您的目标!如果您的VC嵌入在导航控制器中,则可以使用this

希望这会有所帮助。

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