Remove Toolbar:
One of my client requirements is to remove the
default toolbar for the keyboard. I found numerous examples for iOS7 to remove
toolbar from the keyboard window. But it did not work for iOS8. So i came to
following solution after some Research on Google:
Step1:
First we need to add observer for keyboard notification:
[[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(removeKeyboardTopBar:) name:UIKeyboardWillShowNotification object:nil];
Step 2:
We need to implement the method for observer:
- (void)removeKeyboardTopBar {
}
Step 3:
Find the keyboard window from all the application windows:
 - (void)removeKeyboardTopBar {
   UIWindow *keyboardWindow = nil;
UIView* toolBarContainer = nil;
if (![[possibleWindow class] isEqual:[UIWindow class]]) {
keyboardWindow = possibleWindow;
break;
}
}
UIView* toolBarContainer = nil;
    NSArray* windows = [[UIApplication sharedApplication] windows];
    for (UIWindow *possibleWindow in windows) {if (![[possibleWindow class] isEqual:[UIWindow class]]) {
keyboardWindow = possibleWindow;
break;
}
}
}
Step 4:
Find and remove the toolbar:
iOS 7 :
for (UIView *possibleFormView in [keyboardWindow subviews]){
       if ([[possibleFormView description] rangeOfString:@"UIPeripheralHostView"].location != NSNotFound){
                for (UIView *subviewWhichIsPossibleFormView in [possibleFormView subviews]) {
                    if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIWebFormAccessory"].location != NSNotFound) {
                        [subviewWhichIsPossibleFormView removeFromSuperview];
                    }
                }
    }
}
iOS 8:
In iOS 8 you cannot remove the toolbar due to some constraint invalidation issue. So you can hide the view as in following example:
for (UIView *possibleFormView in [keyboardWindow subviews]){
         if([[possibleFormView description] hasPrefix:@"<UIInputSetContainerView"]) {
                for(int i = 0 ; i < [possibleFormView.subviews count] ; i++)
                {
                    UIView* hostkeyboard = [possibleFormView.subviews objectAtIndex:i];
                    if([[hostkeyboard description] hasPrefix:@"<UIInputSetHostView"])
                    {
                        for (id temp in hostkeyboard.subviews)
                        {
                            if ([[temp description] hasPrefix:@"<UIWebFormAccessory"])
                            {
                                UIView* currentToolBar = (UIView*)temp;
                                currentToolBar.hidden = true; //hide the view
                            }
                        }
                    }
             }
     }
}
We are done with tool bar remove code. Following is full source code for remove the tool bar and add a new one in place of that. It will work for both the version:
Source Code:
- (void) removeKeyboardTopBar:(NSNotification*)notify{
    // Locate non-UIWindow.
    UIWindow *keyboardWindow = nil;
    UIView* toolBarContainer = nil;
    NSArray* windows = [[UIApplication sharedApplication] windows];
    for (UIWindow *possibleWindow in windows) {
        if (![[possibleWindow class] isEqual:[UIWindow class]]) {
            keyboardWindow = possibleWindow;
            break;
        }
    }
    CGRect frm = keyboardWindow.frame;
    CGRect toolbarFrame = CGRectMake(0.0f, frm.size.height, frm.size.width, 44.0f);
    // Locate UIWebFormView.
    for (UIView *possibleFormView in [keyboardWindow subviews])
    {
        if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")){
            if([[possibleFormView description] hasPrefix:@"<UIInputSetContainerView"])
            {
                for(int i = 0 ; i < [possibleFormView.subviews count] ; i++)
                {
                    UIView* hostkeyboard = [possibleFormView.subviews objectAtIndex:i];
                    if([[hostkeyboard description] hasPrefix:@"<UIInputSetHostView"])
                    {
                        for (id temp in hostkeyboard.subviews)
                        {
                            if ([[temp description] hasPrefix:@"<UIWebFormAccessory"])
                            {
                                UIView* currentToolBar = (UIView*)temp;
                                currentToolBar.hidden = true;
                                toolbarFrame = currentToolBar.frame;
                                toolBarContainer = hostkeyboard;
                            }
                        }
                    }
                }
            }
        }else{
            if ([[possibleFormView description] rangeOfString:@"UIPeripheralHostView"].location != NSNotFound) {
                for (UIView *subviewWhichIsPossibleFormView in [possibleFormView subviews]) {
                    if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIWebFormAccessory"].location != NSNotFound) {
                        [subviewWhichIsPossibleFormView removeFromSuperview];
                    }
                }
            }
        }
    }
    UIToolbar* toolBar = [[UIToolbar alloc] initWithFrame:toolbarFrame];
    if(toolBarContainer){
        [toolBarContainer addSubview:toolBar];
    }else{
        [keyboardWindow addSubview:toolBar];
        [UIView animateWithDuration:0.25 animations:^{
            toolBar.frame = CGRectMake(0.0f, 220.0f, toolbarFrame.size.width, toolbarFrame.size.height);
        }];
        toolBar.frame = CGRectMake(0.0f, 0.0f, 320.0, 44.0f);
        UIView *v = [[keyboardWindow subviews] objectAtIndex:0];
        [v addSubview:toolBar];
    }
    keyboardWindow = nil;
}

Comments
Post a Comment