user1007522
user1007522

Reputation: 8118

UITableview doesn't scroll up when keyboard is shown

I'm having a startview like this:

enter image description here

Where The first half of the screen is a Google map and the second half is a UITableview with in the header cell a UISearchbar.

When I click on the searchbar this happens on big screens but on small screens my uisearchbar is covered with the keyboard.

enter image description here

As you can see , when the keyboard shows up the searchbar moves a little bit to the bottom. I don't want that. It should push everything up so the Tableview is visible.

I followed a tutorial about contentInset. But it doesn't do anything.

- (void)viewDidLoad
{
    [super viewDidLoad];


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

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

- (void) dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)keyboardWillShow:(NSNotification *)notification
{
    NSLog(@"KeyboardWillshow");
    // Step 1: Get the size of the keyboard.
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;


    // Step 2: Adjust the bottom content inset of your scroll view by the keyboard height.
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0);
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;


    // Step 3: Scroll the target text field into view.
    CGRect aRect = self.view.frame;
    aRect.size.height -= keyboardSize.height;
    if (!CGRectContainsPoint(aRect, _searchBar.frame.origin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, _searchBar.frame.origin.y - (keyboardSize.height-15));
        [self.tableView setContentOffset:scrollPoint animated:YES];
        NSLog(@"Scrolled");
    }
}

- (void)keyboardWillHide:(NSNotification *)notification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;
}

It comes in the if test where Scrolled is printed. And still nothing happens.

Where _searchBar is my UISearchbar variable.

Anyone an idea?

EDIT:

Solved the problem except the UISearchbar jump crapy down when clicking on it. This creates a gap like you can see on the screenshot:

enter image description here

Upvotes: 1

Views: 1700

Answers (2)

BSKANIA
BSKANIA

Reputation: 1315

See the example below.

- (void)keyboardWasShown:(NSNotification*)aNotification

{

NSDictionary* info = [aNotification userInfo];

CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;


CGRect aRect = self.view.frame;

aRect.size.height -= kbSize.height;

float height =150;
float yPoint = aRect.size.height-height;


[self.tblSearch setFrame:CGRectMake(self.tblSearch.frame.origin.x
                                    , yPoint, self.tblSearch.frame.size.width, height)];



}

Upvotes: 2

GreenChiu
GreenChiu

Reputation: 91

If your searchbar, tableview and mapview is all place in a view,

and you want to push the tableview and searchbar visible when keyboardWillshow,

you should update frame instead of contentInset.

Upvotes: 1

Related Questions