這些天項目中碰到一個噁心的bug是關於系統鍵盤的。由於這個項目爲混編,因此在光標獲取和鍵盤調用的時候就會特別有「喜感」(bug)。此前,我只是依稀感受蘋果的原生鍵盤咱們是沒有多大的操做權限的,接觸最多的也就是鍵盤出現和消失的那幾個通知。然而此次我碰到一個硬菜,蘋果九宮格鍵盤坍塌,華麗麗的在個人眼皮子底下塌了,難死我了。如今總結下系統鍵盤它的來世此生。
1.系統鍵盤實際是添加在一個window上的。
咱們將view是添加在window上的,然而咱們平時使用的系統鍵盤它是單獨存在於一個新的window上的。多說一點,別看能夠有好多window(如鍵盤,警示框)可是在一個時刻App中只能主window只有一個。主window存在於響應者鏈中,系統提供了通知供咱們拿到主window的變化。
UIWindowDidBecomeKeyNotification 變爲主window的通知
UIWindowDidResignKeyNotification 取消主window的通知
2.鍵盤的簡單分解
尋找鍵盤思路爲打印出系統window列表取到對應的鍵盤window,再遍歷出子視圖(打印鍵盤和其子視圖的時候,層級是比較多的)。
通常咱們常常使用的鍵盤如英文輸入或者九宮格輸入,它整個鍵盤分爲兩大部分(內部有沒有細分,沒有繼續向下追)。拿九宮格來講,全部的點擊19個相應按鈕(表明a-z以及刪除和各功能的一個個按鈕們)在一個view承載,這個view名字叫作keyboardLayoutStar。其上部就是咱們使用拼音拼出來的漢字顯示欄和咱們點擊的對應字母顯示欄,此兩個在一個view上,view叫作_UIInputViewContent。windows
3.代碼佈局
注意一點,我在調整鍵盤位置到正確的位置的時候,只有同時設置view的frame和layer.frame更改才生效,在此但願研究出緣由的大神能點化下。(我本身的困惑:在學習的時候關於frame的設置歸根到底也就是設置layer的爲何此處出現這樣的問題,仍是個人理解原本就是錯的,但願知曉謎底的大神看到後在笑話完我以後能給答疑下,感之不盡)
- (UIView *)fixKeyboard {
for (UIWindow* window in [UIApplication sharedApplication].windows) {
UIView *inputSetContainer = [self viewWithPrefix:@"<UIInputSetContainerView:" fromView:window];
if (inputSetContainer) {
UIView *inputSetHost = [self viewWithPrefix:@"<UIInputSetHostView:" fromView:inputSetContainer];
if (inputSetHost) {
UIView *kbinputbackdrop = [self viewWithPrefix:@"<_UIKBCompatInputView:" fromView:inputSetHost];
if (kbinputbackdrop) {
//系統鍵盤
UIView *keyboard = [self viewWithPrefix:@"<UIKeyboardAutomatic" fromView:kbinputbackdrop];
CGRect rect;
// NSLog(@"keyboard--%@",keyboard);
for (UIView *view in keyboard.subviews) {
UIView *keyboardLayoutStar = [self viewWithPrefix:@"<UIKeyboardLayoutStar:" fromView:view];
if (keyboardLayoutStar) {
rect = keyboardLayoutStar.frame;
// NSLog(@"keyboardLayoutStar--%@",keyboardLayoutStar);學習
//調整鍵盤上的佈局ip
}
}
}
return keyboard;
}
}
}
}
return nil;
}input
//尋找鍵盤
- (UIView *)viewWithPrefix:(NSString *)prefix fromView:(UIView *)view {
for (UIView *subview in view.subviews) {
// NSLog(@"subview====%@",subview);
if ([[subview description] hasPrefix:prefix]) {
return subview;
}
}
return nil;
}it