我发布此信息是为了帮助人们遇到与我相同的问题,以及一个问题的答案。
在一个UIViewController中,我有多个文本字段,一些位于键盘上方,一些位于键盘下方。同时我在键盘上方有一个工具栏来切换UITextFields。
这就是视图的样子:
要设置文本字段的正确来源,我将不同答案的代码编译成以下代码:
注册keyboardShow和Hide:
override function viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: .UIKeyboardWillHide, object: nil)
}
KeyboardWillShow选择器方法:
func keyboardWillShow(_ notification: Notification) {
if let userInfo = notification.userInfo,
let keyboard = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
let keyboardHeight = self.view.frame.height - keyboard.height
for (_, textField) in textFields.enumerated() {
let textFieldBottom = textField.frame.origin.y + textField.frame.height
let dif = textFieldBottom - keyboardHeight
if textFieldBottom >= keyboardHeight {
if textField.isFirstResponder {
self.view.frame.origin.y = 0
self.view.frame.origin.y -= dif
}
}
}
}
}
KeyboardWillHide选择器方法:
func keyboardWillHide(_ notification: Notification) {
view.frame.origin.y = 0
}
我的问题现在是,当我快速点击工具栏中的某个箭头时,代码将无法移动必要的距离,因此正确的UITextField位于键盘上方。
示例:第一个不正确的答案是第一个响应者。我快速点击两次>箭头。第二个不正确的答案将是键盘上方的UITextField,而第三个不正确的答案将是第一个响应者并且用户无法查看。