iOS之 利用通知(NSNotificationCenter)获取键盘的高度,以及显示和隐藏键盘时修改界面的注意事项
原文连接:http://guohuaden.com/2017/04/30/get-keyboard-height/
我们在开发中会遇到这样的情况:调用键盘时需要界面有一个调整,避免键盘遮掩输入框。
但实现时你会发现,在不同的手机上键盘的高度是不同的。这里列举一下:
//获取键盘的高度
/*
iphone 6:
中文
2014-12-31 11:16:23.643 Demo[686:41289] 键盘高度是 258
2014-12-31 11:16:23.644 Demo[686:41289] 键盘宽度是 375
英文
2014-12-31 11:55:21.417 Demo[1102:58972] 键盘高度是 216
2014-12-31 11:55:21.417 Demo[1102:58972] 键盘宽度是 375
iphone 6 plus:
英文:
2014-12-31 11:31:14.669 Demo[928:50593] 键盘高度是 226
2014-12-31 11:31:14.669 Demo[928:50593] 键盘宽度是 414
中文:
2015-01-07 09:22:49.438 Demo[622:14908] 键盘高度是 271
2015-01-07 09:22:49.439 Demo[622:14908] 键盘宽度是 414
iPhone 7
2016-11-13 17:44:48.315 LoginDemo[2431:120937] 键盘高度是 258
2016-11-13 17:44:48.316 LoginDemo[2431:120937] 键盘宽度是 375
iPhone 7 Plus
2016-11-13 17:43:20.683 LoginDemo[2322:119257] 键盘高度是 271
2016-11-13 17:43:20.683 LoginDemo[2322:119257] 键盘宽度是 414
iphone 5 :
2014-12-31 11:19:36.452 Demo[755:43233] 键盘高度是 216
2014-12-31 11:19:36.452 Demo[755:43233] 键盘宽度是 320
ipad Air:
2014-12-31 11:28:32.178 Demo[851:48085] 键盘高度是 264
2014-12-31 11:28:32.178 Demo[851:48085] 键盘宽度是 768
ipad2 :
2014-12-31 11:33:57.258 Demo[1014:53043] 键盘高度是 264
2014-12-31 11:33:57.258 Demo[1014:53043] 键盘宽度是 768
*/
我们看出不同的手机设备键盘的高度是不同的,而且英文和中文键盘的高度也是不一样的。
下面我们说一下利用通知来获取键盘的高度:
//增加监听,当键盘出现或改变时收出消息
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
//增加监听,当键退出时收出消息
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
显示键盘的代码:
- (void)keyboardWillShow:(NSNotification *)aNotification
{
//获取键盘的高度
NSDictionary *userInfo = [aNotification userInfo];
NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValue CGRectValue];
int height = keyboardRect.size.height;
int width = keyboardRect.size.width;
NSLog(@"键盘高度是 %d",height);
NSLog(@"键盘宽度是 %d",width);
}
隐藏键盘的高度:
//当键盘隐藏的时候
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
//do something
}
当然在注册通知(NSNotificationCenter)后,记得最后的注销通知:
-(void)viewWillDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
注意⚠️:切换键盘时也会产生UIKeyboardWillShowNotification,所以很可能方法被调用多次。最好在keyboardWillShow中不要写与调用次数有关的代码。在键盘第一次产生时,如果不是默认的英文键盘也会调用多次方法。
比如:
#pragma mark - ******************打开键盘********
- (void) keyboardWillShowOfFeedBackVC:(NSNotification *)notify {
//这样写是不正确的:因为切换中英文键盘时都会调用该方法。
// CGRect frame = self.view.frame;
// frame.origin.y = self.view.frame.origin.y - 64;
// self.view.frame = frame;
self.view.frame = CGRectMake(0, -40, IPHONE_WIDTH, IPHONE_HEIGHT);
}
作者:青卷三部
签名:灾难总是接踵而至,这正是世间的常理。只要找个理由,就会有谁来救你吗?要是死了,就只是说明我不过是如此程度的男人。