我必须使用标记将 Swift 3.0 中最后一个 UITextField
中的 UIView
移动到下面提到的委托(delegate)方法上,
func textFieldDidBeginEditing(_ textField: UITextField) {
if (textField.tag == 4){
//UIView Up
}
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
if (textField.tag == 4){
//UIView Down
}
return true
}
我尝试了很多代码,但没有一个像通知等那样工作。
最佳答案
您需要将Observers
添加到NotificationCenter
中,以便在键盘向上向上和向下时监听(我假设您的 textfield 导出是 lastTextField
以使此示例正常工作,但这显然必须适应您为其提供的任何名称)
IBOutlet weak var passwordTextField: UITextField!
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: .UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: .UIKeyboardWillHide, object: nil)
(上面的代码可以添加在viewDidLoad()
中)
然后添加在这些通知到达时要执行的方法,如下所示:
func keyboardWillShow(_ notification:Notification) {
if view.frame.origin.y >= 0 && lastTextField.isFirstResponder {
view.frame.origin.y -= getKeyboardHeight(notification)
}
}
func keyboardWillHide(_ notification:Notification) {
if view.frame.origin.y < 0 {
view.frame.origin.y += getKeyboardHeight(notification)
}
}
这些方法中的验证可以防止双重执行,例如在文本字段之间移动时向上/向下移动两次,而无需放弃第一响应者,这在像您这样的情况下很常见(我假设您这样做是为了一个表单,因此需要澄清您只需要第四个文本字段)。请注意,我仅在 keyboardWillShow
方法中对指定的文本字段(及其导出 lastTextField
)进行验证,以防您在显示键盘时移动另一个文本字段并退出响应者,在这种情况下,即使它不是您开始的原始位置,当键盘隐藏时, View 也会返回到其原始位置。
您还需要一种获取键盘高度的方法,这个可以帮助您:
func getKeyboardHeight(_ notification:Notification) -> CGFloat {
let userInfo = notification.userInfo
let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue // of CGRect
return keyboardSize.cgRectValue.height
}
让我知道进展如何,但我刚刚在我的应用程序上测试了相同的代码,它可以工作,所以你应该没问题。
PS:请密切注意 Storyboard(如果您正在使用它)以及文本字段的委托(delegate)
是否已正确设置。
关于swift - 查看在特定文本字段委托(delegate)中向上移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45595172/