I recently built an application where I wanted to be able to toggle the UISearchBar that sits on top of the UITableView. Basically, the app would provide a magnifiying glasses button and when clicked, it would hide this view. By default, the search bar would be showing.

The first step to this is to create a local BOOL named _isHidden and set it to NO in viewDidLoad.

- (void)viewWillAppear:(BOOL)animated {
_isHidden = NO;
...
tableViewHeader = self.tableView.tableHeaderView;
}

Now, to make the UISearch bar disappear, you need to use a UIView animation block:

- (void)toggleSearchBar{
CGRect frame;
if(!_isHidden){
frame = CGRectMake(0, 0, 320, 0.0f);
_isHidden = YES;
} else {
frame = CGRectMake(0, 0, 320, searchBarHeight);
_isHidden = NO;
}

[UIView
animateWithDuration:0.3
animations:^{
searchBar.frame = frame;
} completion:^(BOOL finished) {
if(_isHidden){
self.tableView.tableHeaderView = nil;
} else{
self.tableView.tableHeaderView = tableViewHeader;
}
}];
}

This code is pretty simple. First, I’m looking at the global _isHidden variable and setting the frame of the UISearchBar to either 0.0f or searchBarHeight (currently set to 44.0f). In the animation block, I am reseting the frame over a period of 300 milliseconds. After the animation is complete, it is important that you reset the tableHeaderView, otherwise you are going to see a gap at the top of your UITableViewController. To hide this gap, you set

self.tableView.tableHeaderView = nil;

And when you want to un-hide the UISearchBar, use:

self.tableView.tableHeaderView = tableViewHeader;

Notice, tableViewHeader was set in viewDidLoad. I can confirm this works pretty well, and I have not found a better solution online after searching for about 15 minutes.