做app开发,经常会遇到输入框被键盘遮住的情况,譬如注册界面有很多信息需要输入,点击靠屏幕下方的输入框就会遇到输入框被键盘遮住的情况。查阅网上的很多资料,有的是仅依靠UITextField的三个代理方法加上写死键盘的高度来解决的,还有的是依靠一个第三方库IQKeyboardManager,依靠第三方库固然节省了很多开发时间,但是如果你的项目仅仅只是注册界面一个界面用到,导入库反而没有自己几句代码写的方便。下面我把自己的解决方法介绍一下,供大家参考。
(注释:下面代码使用Swift语言,OC语言同理)
大体思路:使用键盘通知UIKeyboardWillShow和UIKeyboardWillHide,配合UITextFieldDelegate代理方法func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool解决。实现如下图所示的界面:
注意:如果是小屏幕手机的话,按下面三个输入框的时候,键盘就会遮住输入框
要注意两个问题:1、不是所有系统键盘高度都是一样的,需要去动态获取
2、键盘通知和代理方法textFieldShouldBeginEditing的调用是代理方法先调用,键盘通知后调用
解决方案:
@IBOutlet weak var scrollView: UIScrollView!
private var textFieldTmp:UITextField?
override func viewDidLoad() {
super.viewDidLoad()
//一定要写上代理,不然下面的textFieldDelegate方法不会执行
tfEmail.delegate = self
tfAuthCode.delegate = self
tfPWD.delegate = self
tfConfirmPWD.delegate = self
tfRealName.delegate = self
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisapear(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func keyboardWillAppear(_ notification:Notification){//键盘出现
let keyboardInfo = notification.userInfo![UIKeyboardFrameBeginUserInfoKey]
let keyboardHeight = (keyboardInfo! as AnyObject).cgRectValue.size.height//键盘高度
let rect = textFieldTmp?.convert((textFieldTmp?.frame)!, to: self.scrollView)//这里要看上面的那些textFiled是不是嵌套在别的view上,否则获取的rect是不准确的
if kScreenHeight - kNavigationAndStatusBarHeight - ((rect?.origin.y)! + 44) < keyboardHeight {
let yOffset = keyboardHeight - (kScreenHeight - kNavigationAndStatusBarHeight - ((rect?.origin.y)! + 44))
self.scrollView.setContentOffset(CGPoint(x: 0, y: yOffset), animated: true)
}
}
func keyboardWillDisapear(_ notification:Notification) {//键盘消失
self.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
}
///mark - UITextFieldDelegate
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
textFieldTmp = textField
return true
}
希望对大家有所帮助