thenetimp
thenetimp

Reputation: 9820

Move UIScrollView when keyboard comes into place

[Edit:] The problem has been solved. I did not have my delegates linked properly in UIBuilder. Code is good!

I am trying to resize a scrollview when the keyboard appears. I went to the developer docs and found this information.

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW1

On the left "Managing the keyboard".

In the documentation it shows a bit of code to detect the size of the keyboard and then to resize a UIScrollView. I have placed an NSLog message in the code for function - (void)keyboardWasShown:(NSNotification*)aNotification so I see that the function is actually being called, but when I try to to NSLog the kbSize.height it is always valued at 0.

Why does the code that apple provide for this purpose not work?

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your application might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

Upvotes: 15

Views: 23941

Answers (4)

bogen
bogen

Reputation: 10422

One simple solution is to add the extension UIViewController+Keyboard.swift to your project, with a single line

setupKeyboardNotifcationListenerForScrollView(scrollView)

it will auto resize automatically when keyboard appears. No need to subclass anything, just an extension! Its availble at GitHub SingleLineKeyboardResize

Upvotes: 0

DBD
DBD

Reputation: 23213

I've done this several times with a UITableView (which is just an extended UIScrollView). You can find the code in this answer.

Upvotes: 0

Reuven
Reuven

Reputation: 2132

You may want to try the highly recommended "TPKeyboardAvoidingScrollView", available from: https://github.com/michaeltyson/TPKeyboardAvoiding

Works like a charm...

Upvotes: 33

Mihai Fratu
Mihai Fratu

Reputation: 7663

Have you ever added an observer for that specific notification? Make sure that in your loadView method you do this:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];

Don't forget to unregister the observer on viewDidUnload method like this:

[[NSNotificationCenter defaultCenter] removeObserver:self];

Let me know if that works out!

Upvotes: 3

Related Questions