为什么我根据键盘高度调整视图的功能表现不稳定



我正在尝试重新创建一个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)
}

}

我真的很感激能为我做些什么来纠正这个问题。

这似乎是这里提出的一个已知问题,也是其他SO问题。。

需要注意的两点:-

1( 在处使用UIResponder.keyboardFrameEndUserInfoKey而不是UIResponder.keyboardFrameBeginUserInfoKey

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

keyboardWillShow()

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

然而,当我关闭键盘并重新单击任何文本字段时按预期向上:仅当顶部文本字段达到屏幕。

这是一种错误的行为,除了工具栏和之外,你会得到不正确的高度

问题是,用户第一次点击文本字段键入(无论是哪一个(,屏幕向上移动得太远,这样顶部的电子邮件文本字段最终超出了顶部

这实际上是具有实际高度的预期行为。你可以计算工具栏的高度,并将其从这个高度降低,以实现你的目标!如果你的VC嵌入在导航控制器中,你可以使用这个

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新