Hiding the UISearchBar with animiation
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.