如何在出现视图时同时显示键盘和上移UIView?
How do I display the keyboard and move up the UIView at the same time when the view appears?
我创建了一个带有包含文本字段的 UIView 的视图控制器(注意:视图控制器显示为模态)。当您点击文本字段时,会出现一个键盘,并且 UIView 会向上移动屏幕,这样文本字段就不会被遮挡。但是,我的目标是从模态最初出现时的一开始就显示键盘和(清晰的)UIView ,这是我正在努力实现的。
我试过将 textField.becomeFirstResponder() 插入到 viewDidLoad 中,但这会显示键盘,但不会将 UIView 移动到其所需(即可见)位置。我也试过将它插入到 viewDidAppear 中,但这首先显示 UIView,然后停顿一秒钟,然后显示键盘并以非常尴尬的过渡向上移动 UIView。
如果有人能提供一些解决此问题的建议,那就太好了。我的代码如下。
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .darkGray
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
//The line below will display the keyboard over the UIView, thus obscuring it.
textField.becomeFirstResponder()
}
@objc func keyboardWillShow(_ notification: Notification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
}
let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
self.view.frame.origin.y = 0 - keyboardSize!.height
}
下面是视觉参考。
您可以添加动画块让您的视图看起来更好,您还需要像这样匹配键盘动画的速度:
if let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double {
UIView.animate(withDuration: duration, animations: { [weak self] in
self?.view.layoutIfNeeded()
})
}
这应该添加到您的 keyboardWillShow 函数的末尾。
另外,将 textField.becomeFirstResponder()
移动到 viewWillAppear 可能会更好。
引用 (IBOutlet
) 视图的底部约束,将其命名为 bottomConstraint
或您喜欢的任何名称。
然后就像您在 keyboardWillShow
选择器中所做的那样,提取键盘高度,并将该高度分配给 bottomConstraint
的 constant
属性。如果需要,可以添加动画。
import UIKit
class SecondViewController: UIViewController {
@IBOutlet var textField: UITextField!
@IBOutlet weak var bottomConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .darkGray
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
//The line below will display the keyboard over the UIView, thus obscuring it.
textField.becomeFirstResponder()
}
@objc func keyboardWillShow(_ notification: Notification) {
let info = notification.userInfo!
let kbHeight = (info[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
bottomConstraint.constant = -kbHeight
let duration: TimeInterval = (info[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
UIView.animate(withDuration: duration) { self.view.layoutIfNeeded() }
}
}
我创建了一个带有包含文本字段的 UIView 的视图控制器(注意:视图控制器显示为模态)。当您点击文本字段时,会出现一个键盘,并且 UIView 会向上移动屏幕,这样文本字段就不会被遮挡。但是,我的目标是从模态最初出现时的一开始就显示键盘和(清晰的)UIView ,这是我正在努力实现的。
我试过将 textField.becomeFirstResponder() 插入到 viewDidLoad 中,但这会显示键盘,但不会将 UIView 移动到其所需(即可见)位置。我也试过将它插入到 viewDidAppear 中,但这首先显示 UIView,然后停顿一秒钟,然后显示键盘并以非常尴尬的过渡向上移动 UIView。
如果有人能提供一些解决此问题的建议,那就太好了。我的代码如下。
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .darkGray
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
//The line below will display the keyboard over the UIView, thus obscuring it.
textField.becomeFirstResponder()
}
@objc func keyboardWillShow(_ notification: Notification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
}
let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
self.view.frame.origin.y = 0 - keyboardSize!.height
}
下面是视觉参考。
您可以添加动画块让您的视图看起来更好,您还需要像这样匹配键盘动画的速度:
if let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double {
UIView.animate(withDuration: duration, animations: { [weak self] in
self?.view.layoutIfNeeded()
})
}
这应该添加到您的 keyboardWillShow 函数的末尾。
另外,将 textField.becomeFirstResponder()
移动到 viewWillAppear 可能会更好。
引用 (IBOutlet
) 视图的底部约束,将其命名为 bottomConstraint
或您喜欢的任何名称。
然后就像您在 keyboardWillShow
选择器中所做的那样,提取键盘高度,并将该高度分配给 bottomConstraint
的 constant
属性。如果需要,可以添加动画。
import UIKit
class SecondViewController: UIViewController {
@IBOutlet var textField: UITextField!
@IBOutlet weak var bottomConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .darkGray
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
//The line below will display the keyboard over the UIView, thus obscuring it.
textField.becomeFirstResponder()
}
@objc func keyboardWillShow(_ notification: Notification) {
let info = notification.userInfo!
let kbHeight = (info[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
bottomConstraint.constant = -kbHeight
let duration: TimeInterval = (info[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
UIView.animate(withDuration: duration) { self.view.layoutIfNeeded() }
}
}