iPhone SDK: Setting the size of UISearchDisplayController's table view

Chris Newman picture Chris Newman · Mar 5, 2010 · Viewed 18.2k times · Source

My app's table view does not occupy the full screen height, as I've allowed 50px at the bottom for a banner.

When I begin typing in the search bar, the search results table view is larger; it fills all available screen space between the search bar and the tab bar. This means that the very last search result is obscured by the banner.

How do I specify the size of the table view used by UISearchDisplayController? There's no bounds or frame property that I can see.

EDIT TO ADD SCREENSHOTS:

This is how the table view is set up in IB. It ends 50px short of the synthesized tab bar.

alt text
(source: lightwood.net)

This is how content displays normally. I've scrolled to the very bottom here. alt text
(source: lightwood.net)

This is how it displays when searching. Again, I've scrolled to the very bottom. If I disable the banner ad, I can see that the search display table spreads right down to the tab bar.

alt text
(source: lightwood.net)

Answer

Chris Newman picture Chris Newman · Mar 7, 2010

The key to solving this one was finding out when to change the geometry of the table view. Calling:

[self.searchDisplayController.searchResultsTableView setFrame:someframe];

after creating the UISearchDisplayController was futile. The answer was this delegate method:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    tableView.frame = someframe;
}

Note, I had also tried -searchDisplayController:didLoadSearchResultsTableView but it did no good in there. You have to wait until it's displayed to resize it.

Also note that if you simply assign tableView.frame = otherTableView.frame, the search results table overlaps its corresponding search bar, so it is impossible to clear or cancel the search!

My final code looked like this:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {

    CGRect f = self.masterTableView.frame;  // The tableView the search replaces
    CGRect s = self.searchDisplayController.searchBar.frame;
    CGRect newFrame = CGRectMake(f.origin.x,
                                 f.origin.y + s.size.height,
                                 f.size.width,
                                 f.size.height - s.size.height);

    tableView.frame = newFrame;
}