在我们开发中,经常会遇到键盘遮挡着输入框的情况,那么我们怎么去解决呢,如果动态的调整输入框,使其显示出来不被遮挡。
我们主要的思路是,如果键盘遮挡了输入框,那么就像整个页面向上移动一定的距离,使其显现出来。
什么时候页面才会向上移动,当
textfield的距离屏幕的最大Y值 + 键盘的高度 > 屏幕的高度
就需要上移了。上移的高度就是
textfield的距离屏幕最大Y值 + 键盘的高度 — 屏幕的高度
现在,我们利用通知得到键盘的高度,首先我们认识一些通知
//键盘将要出现
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
//键盘已经出现
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
//键盘将要消失
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
//键盘已经消失
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
//键盘的frame将要改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
//键盘的frame改变完毕
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidChangeFrame:) name:UIKeyboardDidChangeFrameNotification object:nil];
当键盘出现、消失或者改变frame的时候,都会触发通知
我们主要是利用键盘已经出现进行屏幕上移 和 键盘已经消失进行屏幕还原。(当然你也可以利用键盘将要出线和将要消失进行屏幕的移动)
键盘高度我们可以在通知方法中,利用
- (void)keyboardDidShow:(NSNotification *)info {
//获取键盘高度,
CGFloat kbHeight = [[info.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
NSLog(@"键盘高度 %f",kbHeight);
}
获得。
最后别忘了在界面消失的时候移除观察者
//键盘将要出现
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
//键盘已经出现
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
//键盘将要消失
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
//键盘已经消失
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
//键盘的frame将要改变
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillChangeFrameNotification object:nil];
//键盘的frame改变完毕
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidChangeFrameNotification object:nil];
效果如下
这里只是说了一下思路,具体的代码见下方。里面有详细的备注
Demo代码地址:https://github.com/312179361/KeyBoardManager.git
联系方式:QQ:3020495503
有建议和意见的欢迎骚扰,共同交流。请备注,“我在简书上看到你的博客,一起交流吧”。
网友评论