Move UIScrollView when keyboard comes into place

23,913

Solution 1

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

Works like a charm...

Solution 2

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!

Share:
23,913
thenetimp
Author by

thenetimp

Geek.

Updated on December 27, 2020

Comments

  • thenetimp
    thenetimp over 3 years

    [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];
        }
    }
    
  • thenetimp
    thenetimp over 12 years
    I did add the observers, as I mentioned I can see the function is called when the keyboard shows, so I do know that the observer is working. Thanks though always good to double check things,
  • Groot
    Groot about 11 years
    +1 Easy as hell to implement and really good. I suggest combining it with the BSKeyboardControl to add navigation control in the textfields: cocoacontrols.com/controls/bskeyboardcontrols
  • Cameron Lowell Palmer
    Cameron Lowell Palmer over 10 years
    You need to update this post. viewDidUnload is no longer called.
  • Maniganda saravanan
    Maniganda saravanan about 10 years
    @Reuven When using TPKeyboardAvoidingScrollview, Sometimes if we copy and paste in textview the view entirely goes up,.. is there any solution for that?..
  • fatuhoku
    fatuhoku almost 10 years
    Does it work with UIPresentationModeFormSheet though?