【发布时间】:2017-03-24 01:03:02
【问题描述】:
我有一个 loginView,里面有两个 textField 和一个按钮。我必须在点击 textField 时向上移动视图,并在按下返回键时向下移动视图。
我的问题是它在所有条件下都可以正常工作,但是当点击一个 textField 视图时,它会向上移动,但同时当我们进入下一个 textField 视图时,它会向下移动。
import UIKit
class CheckFontIconView: UIViewController,UITextFieldDelegate {
var activeField: UITextField?
@IBOutlet weak var loginFieldsView: UIView!
@IBOutlet weak var label: UILabel!
@IBOutlet weak var mobileNo: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
mobileNo.delegate = self
textFieldPassword.delegate = self
registerForKeyboardNotifications()
}
@IBAction func btnLoginAction(_ sender: Any) {
}
deinit {
//NotificationCenter.default.removeObserver(self)
self.deregisterFromKeyboardNotifications()
}
func registerForKeyboardNotifications() {
//Adding notifies on keyboard appearing
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func deregisterFromKeyboardNotifications() {
//Removing notifies on keyboard appearing
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func keyboardWasShown(notification: NSNotification) {
//Need to calculate keyboard exact size due to Apple suggestions
var info = notification.userInfo!
let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
if self.activeField != nil {
self.loginFieldsView.frame.origin.y -= (keyboardSize?.height)!
}
}
func keyboardWillBeHidden(notification: NSNotification) {
//Once keyboard disappears, restore original positions
var info = notification.userInfo!
let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
self.loginFieldsView.frame.origin.y -= (keyboardSize?.height)!
self.loginFieldsView.endEditing(true)
}
func textFieldDidBeginEditing(_ textField: UITextField) {
self.activeField = textField
}
func textFieldDidEndEditing(_ textField: UITextField) {
self.activeField = nil
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
activeField?.resignFirstResponder()
return true
}
}
【问题讨论】:
-
最简单的方法是制作一个标志来标记您的键盘是否显示。因此,在未显示或案例移动到下一个文本字段的情况下处理它。
-
是的,我尝试了之前设置标志的方法,但同样的问题来了。
-
如果您将在登录视图中使用 UIScrollView,那么您的问题可能会得到解决。
-
我尝试运行您的代码,但当我选择第一个文本字段时出现问题,当显示键盘时,我继续选择第二个文本字段,您的视图又向上移动了一次。所以我认为你应该改变你的计算方法。
-
在我看来,您应该存储原始视图框架值和移动的视图框架以进行切换,而不是使用
self.loginFieldsView.frame.origin.y -= (keyboardSize?.height)!
标签: ios view keyboard uitextfield swift3