iOS get Keyboard Window

前端 未结 4 1201
一生所求
一生所求 2021-01-13 00:16

So in iOS 7 I always got the Keyboard Window like this:

- (UIView *)keyboardView
{
    UIWindow* tempWindow;

    //Because we cant get access to the UIKeybo         


        
相关标签:
4条回答
  • 2021-01-13 00:48

    I also had this problem and found the solution.

    Below is the code which will work for iOS 8.0 and also for below versions.

    I have tested it on iOS 7 and 8.0 (Xcode Version 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;
        }
    }
    

    Hope this helps.

    0 讨论(0)
  • 2021-01-13 01:01

    What i use to get the window for the keyboard is

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

    From my logs on iOS8 this contains one view

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

    Which contains another view

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

    Since those dimensions are 216.0f height i guess that is the keyboard. Was this what you where looking for?

    0 讨论(0)
  • 2021-01-13 01:04

    On iOS 13, we can get keyboard window like this:

    let windows = UIApplication.shared.windows
    if let keyboardWindow = windows.first(where: { NSStringFromClass($0.classForCoder) == "UIRemoteKeyboardWindow" }) {
      return
    }
    
    0 讨论(0)
  • 2021-01-13 01:08

    In the first iOS 8 beta, the system keyboard is the UIInputSetHostView subview of the UIInputSetContainerView subview of one of the application windows.

    0 讨论(0)
提交回复
热议问题