X0r0N
X0r0N

Reputation: 1944

Shrink UIWebView when keyboard appears

On my iPhone app i have a UIWebView with toolbars above an below it. the toolbar on the bottom contains a text box for the user to input some text. but when i click on the text box, the keyboard covers the bottom half of the screen.

how do i make it so that the toolbars stay above and below the webview but the the height of the webview shrinks for the keyboard to be displayed?

any guidance on this is appreciated.

thanks in advanced.

Upvotes: 1

Views: 4780

Answers (2)

Rami Enbashi
Rami Enbashi

Reputation: 3556

You can implement UITextFieldDelegate in your UIViewController and set the UITextField delegate value to your controller and then implement textFieldDidBeginEditing and textFieldDidEndEditing methods in your controller to detect when editing starts/ends.

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    // in case you have more than one text fields in the same view
    if(textField == self.YOUR_FIELD_NAME) 
       // change the web view height here, you can also animate it using UIView beginAnimations
       CGRect frame = self.webView.frame;
       frame.size.height = 200;
       self.webView.frame = frame;
}


    - (void)textFieldDidEndEditing:(UITextField *)textField{
    // do the opposite here
} 

Upvotes: -1

malex
malex

Reputation: 10096

To shrink webView you need the following:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}


- (void)keyboardWillShow:(NSNotification *)notification
{    
    CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardFrame = [self.view convertRect:keyboardFrame fromView:self.view.window];

    NSTimeInterval keyboardAnimationDuration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationOptions keyboardAnimationCurve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue] << 16;

    CGFloat keyboardHeight = keyboardFrame.size.height;

    [UIView animateWithDuration:keyboardAnimationDuration delay:0 options:keyboardAnimationCurve 
    animations:^{
            _webView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
    }
    completion:NULL];
}


- (void)keyboardWillHide:(NSNotification *)notification
{    
    NSTimeInterval keyboardAnimationDuration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationOptions keyboardAnimationCurve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue] << 16;

    [UIView animateWithDuration:keyboardAnimationDuration delay:0 options:keyboardAnimationCurve 
    animations:^{
            _webView.contentInset = UIEdgeInsetsZero;
    }
    completion:NULL];
}

In the case of additional subviews you should slightly change this code (add change of the frames for other subview)

Upvotes: 4

Related Questions