iOS获得键盘窗口

所以在iOS 7中我总是有这样的键盘窗口:

- (UIView *)keyboardView { UIWindow* tempWindow; //Because we cant get access to the UIKeyboard throught the SDK we will just use UIView. //UIKeyboard is a subclass of UIView anyways UIView* keyboard; NSLog(@"windows %d", [[[UIApplication sharedApplication]windows]count]); //Check each window in our application for(int c = 0; c < [[[UIApplication sharedApplication] windows] count]; c ++) { //Get a reference of the current window tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:c]; //Get a reference of the current view for(int i = 0; i < [tempWindow.subviews count]; i++) { keyboard = [tempWindow.subviews objectAtIndex:i]; NSLog(@"view: %@, on index: %d, class: %@", [keyboard description], i, [[tempWindow.subviews objectAtIndex:i] class]); if([[keyboard description] hasPrefix:@"(lessThen)UIKeyboard"] == YES) { //If we get to this point, then our UIView "keyboard" is referencing our keyboard. return keyboard; } } for(UIView* potentialKeyboard in tempWindow.subviews) // if the real keyboard-view is found, remember it. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { if([[potentialKeyboard description] hasPrefix:@"<UILayoutContainerView"] == YES) keyboard = potentialKeyboard; } else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) { if([[potentialKeyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) keyboard = potentialKeyboard; } else { if([[potentialKeyboard description] hasPrefix:@"<UIKeyboard"] == YES) keyboard = potentialKeyboard; } } NSLog(@"view: %@, on index: %d", [keyboard description]); return keyboard; } 

但在iOS 8 beta 1&2中,返回的窗口/视图是主要的应用程序窗口。 任何想法是什么在我的代码中的问题? 在我的iOS 7testing设备上,它的效果非常好

我也有这个问题,find了解决办法。

以下是适用于iOS 8.0以及以下版本的代码。

我已经testing了它在iOS 7和8.0(Xcode版本6.0.1)

 - (void)addButtonToKeyboard { // create custom button self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.doneButton.frame = CGRectMake(0, 163+44, 106, 53); self.doneButton.adjustsImageWhenHighlighted = NO; [self.doneButton setTag:67123]; [self.doneButton setImage:[UIImage imageNamed:@"doneup1.png"] forState:UIControlStateNormal]; [self.doneButton setImage:[UIImage imageNamed:@"donedown1.png"] forState:UIControlStateHighlighted]; [self.doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside]; // locate keyboard view int windowCount = [[[UIApplication sharedApplication] windows] count]; if (windowCount < 2) { return; } UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; UIView* keyboard; for(int i = 0 ; i < [tempWindow.subviews count] ; i++) { keyboard = [tempWindow.subviews objectAtIndex:i]; // keyboard found, add the button if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES){ UIButton* searchbtn = (UIButton*)[keyboard viewWithTag:67123]; if (searchbtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard) [keyboard addSubview:self.doneButton]; }//This code will work on iOS 8.0 else if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES){ for(int i = 0 ; i < [keyboard.subviews count] ; i++) { UIView* hostkeyboard = [keyboard.subviews objectAtIndex:i]; if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES){ UIButton* donebtn = (UIButton*)[hostkeyboard viewWithTag:67123]; if (donebtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard) [hostkeyboard addSubview:self.doneButton]; } } } } } 

>

  -(void) removedSearchButtonFromKeypad{ int windowCount = [[[UIApplication sharedApplication] windows] count]; if (windowCount < 2) { return; } UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; for(int i = 0 ; i < [tempWindow.subviews count] ; i++) { UIView* keyboard = [tempWindow.subviews objectAtIndex:i]; if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES){ [self removeButton:keyboard]; }else if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES){ for(int i = 0 ; i < [keyboard.subviews count] ; i++) { UIView* hostkeyboard = [keyboard.subviews objectAtIndex:i]; if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES){ [self removeButton:hostkeyboard]; } } } } } -(void) removeButton:(UIView*)keypadView{ UIButton* donebtn = (UIButton*)[keypadView viewWithTag:67123]; if(donebtn){ [donebtn removeFromSuperview]; donebtn = nil; } } 

希望这可以帮助。

我用什么来获得键盘的窗口是

 - (void)findKeyboardWindow { for (UIWindow *window in [[UIApplication sharedApplication] windows]) { if ([NSStringFromClass([window class]) isEqualToString:@"UITextEffectsWindow"]) { _keyboardWindow = window; break; } } } 

从我在iOS8上的日志,这包含一个视图

 UIInputSetContainerView: 0x190d4430; frame = (0 0; 320 568); autoresize = W+H; layer = CALayer: 0x190d4630 

其中包含另一种观点

 UIInputSetHostView: 0x190d4820; frame = (0 352; 320 216); layer = CALayer: 0x190d49c0 

由于这些尺寸是216.0f高度,我想这是键盘。 这是你在哪里寻找?

在第一个iOS 8testing版中,系统键盘是其中一个应用程序窗口的UIInputSetContainerView子视图的UIInputSetHostView子视图。