問題:橫屏下第一次彈出鍵盤高度異常
1
2
3
4
5
6
7
8
9
10
11
|
- ( void )handleKeyboardWillShowNotification:(NSNotification *)notification { NSTimeInterval animationDuration = 0; CGRect keyboardFrame = CGRectZero; NSDictionary *userInfo = [notification userInfo]; [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame]; printf ( "keyboardFrame height: %f\n" , keyboardFrame.size.height); [self showWithAnimationDuration:animationDuration keyboardFrame:keyboardFrame]; } |
彈出新window,rootViewController里面有個 UITextField ,然后調用 becomeFirstResponder ,啟動app,第1次彈出鍵盤時,會走進兩次通知,打印鍵盤高度:
1
2
|
keyboardFrame height: 125.000000 keyboardFrame height: 302.000000 |
這兩個高度都是錯誤的,會導致鍵盤上面的工具條錯位:
第2次彈出鍵盤時:打印鍵盤高度為:
1
|
keyboardFrame height: 248.000000 |
這時候就是正常的高度了。
需要解決第一次異常的問題。
解決:直接取子view判斷
查看層級,發現鍵盤window有個子view UIInputSetHostView,這就是鍵盤顯示的父view,這時候取得這個view,也就取得了鍵盤的真正高度:
1
2
3
4
5
6
7
8
|
- (CGFloat)keyboardHeight { UIWindow *keyboardWindow = [[[UIApplication sharedApplication] windows] lastObject]; UIView *inputView = [keyboardWindow.rootViewController.view tkp_findSubview:@ "UIInputSetHostView" ]; if (inputView) { return inputView.tkp_height; } return 0; } |
其中 tkp_findSubview: 方法為 UIView 的分類方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
- (UIView *)tkp_findSubview:(NSString *)name { return [self tkp_findSubview:name resursion:NO]; } - (UIView *)tkp_findSubview:(NSString *)name resursion:( BOOL )resursion { Class class = NSClassFromString(name); for (UIView *subview in self.subviews) { if ([subview isKindOfClass: class ]) { return subview; } } if (resursion) { for (UIView *subview in self.subviews) { UIView *tempView = [subview tkp_findSubview:name resursion:resursion]; if (tempView) { return tempView; } } } return nil; } |
總結
到此這篇關于iOS橫屏彈鍵盤的高度錯誤異常解決的文章就介紹到這了,更多相關iOS橫屏彈鍵盤高度內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/6950848385511325726