利用通知(`NSNotificationCenter`)获取键盘的高度,以及显示和隐藏键盘时修改界面的注意事项
2017-04-30 10:42:19 # Objective-C

我们在开发中会遇到这样的情况:调用键盘时需要界面有一个调整,避免键盘遮掩输入框。

但实现时你会发现,在不同的手机上键盘的高度是不同的。这里列举一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//获取键盘的高度
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

我们看出不同的手机设备键盘的高度是不同的,而且英文和中文键盘的高度也是不一样的。

下面我们说一下利用通知来获取键盘的高度:

1
2
3
4
5
6
7
8
9
10
11
//增加监听,当键盘出现或改变时收出消息
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];

//增加监听,当键退出时收出消息
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];

显示键盘的代码:

1
2
3
4
5
6
7
8
9
10
11
- (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);
}

隐藏键盘的高度:

1
2
3
4
5
//当键盘隐藏的时候
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
//do something
}

当然在注册通知(NSNotificationCenter)后,记得最后的注销通知:

1
2
3
4
-(void)viewWillDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

⚠️:切换键盘时也会产生 UIKeyboardWillShowNotification ,所以很可能方法被调用多次。最好在 keyboardWillShow 中不要写与调用次数有关的代码。在键盘第一次产生时,如果不是默认的英文键盘也会调用多次方法。

比如:

1
2
3
4
5
6
7
8
9
10
11
#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);

}