Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make bottom of UITableview move up with keyboard [duplicate]

I have an application with a UITableview and a UITextView, so sometimes the keyboard is up. Whenever the keyboard is up, I can't access the bottom 3-4 table cells because they are always stuck behind the keyboard. How can I make the UITableView only take up the space above the keyboard while the keyboard is displayed?

Screenshot of app

like image 369
Jakob Weisblat Avatar asked Sep 06 '13 00:09

Jakob Weisblat


2 Answers

I normally use https://github.com/michaeltyson/TPKeyboardAvoiding Which will automatically solve your normal problem But if you want to do some coding manually

Use table views setContentOffset or scrollToRowAtIndexPath

    CGPoint scrollPt = CGPointMake(textFieldRect.origin.x, textFieldRect.origin.y);  
  [_tableView setContentOffset:scrollPt animated:YES];

    UITableViewCell *cell = (UITableViewCell*) [[textField superview] superview];
    [_tableView scrollToRowAtIndexPath:[_tableView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionTop animated:YES];
like image 143
Bishal Ghimire Avatar answered Nov 16 '22 01:11

Bishal Ghimire


I've had the same problem, and here is my solution. Hope it helps.

- (void) keyboardWillShow: (NSNotification*) aNotification
{
    [UIView animateWithDuration: [self keyboardAnimationDurationForNotification: aNotification] animations:^{
        CGSize kbSize = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
        //change the frame of your talbleiview via kbsize.height
    } completion:^(BOOL finished) {
    }];
}

- (void) keyboardDidShow: (NSNotification*) aNotification
{    
    [UIView animateWithDuration: [self keyboardAnimationDurationForNotification: aNotification] animations:^{
        CGSize kbSize = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
        //change the frame of your talbleiview via kbsize.height
    } completion:^(BOOL finished) {
    }];
}

- (void) keyboardWillDisappear: (NSNotification*) aNotification
{
    [UIView animateWithDuration: [self keyboardAnimationDurationForNotification: aNotification] animations:^{
        //restore your tableview
    } completion:^(BOOL finished) {
    }];
}

- (NSTimeInterval) keyboardAnimationDurationForNotification:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    NSValue* value = [info objectForKey: UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval duration = 0;
    [value getValue: &duration];

    return duration;
}

Add and remove event listeners.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(keyboardWillShow:)
                                                 name: UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(keyboardDidShow:)
                                                 name: UIKeyboardDidShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(keyboardWillDisappear:)
                                                 name: UIKeyboardWillHideNotification object:nil];
    }
- (void) dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver: self name: UIKeyboardWillShowNotification object: nil];
    [[NSNotificationCenter defaultCenter] removeObserver: self name: UIKeyboardDidShowNotification object: nil];
    [[NSNotificationCenter defaultCenter] removeObserver: self name: UIKeyboardWillHideNotification object: nil];
}

Methion that multi events will be received during one keyboard animation.

like image 34
MasterBeta Avatar answered Nov 16 '22 02:11

MasterBeta