Recently I needed to fully customize a UISearchBar, so here are some basic “recipes” on how to manage that using a UISearchDisplayController.
1. Changing the title of the “cancel” button
If you want to localize your UISearchBar or just want to apply a unique text matching your application just implement the following UISearchDisplayControllerDelegate method:
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{ [searchBar setShowsCancelButton:YES animated:NO]; for(UIView *subView in searchBar.subviews){ if([subView isKindOfClass:[UIButton class]]){ [(UIButton*)subView setTitle:@"myCustomTitle" forState:UIControlStateNormal]; } } }
2. Changing the title of the “no results” label
Again you need to implement a delegate method
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
for(UIView *subview in searchController.searchResultsTableView.subviews) {
if([subview isKindOfClass:[UILabel class]]) {
[(UILabel*)subview setText:@"my custom 'no results' text"];
}
}
return YES;
}
3. Custom background image
Insert this snippet directly after you initialized your UISearchBar
searchBarOverlay = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SearchBarBack"]]; searchBarOverlay.frame = CGRectMake(-8, -2, 320, 48); [searchBar addSubview:searchBarOverlay]; [searchBar sendSubviewToBack:searchBarOverlay]; for (UIView *v in [searchBar subviews]) { if ([NSStringFromClass([v class]) isEqualToString:@"UISearchBarBackground"]) { [searchBar sendSubviewToBack:v]; } if ([NSStringFromClass([v class]) isEqualToString:@"UIImageView"] && v != searchBarOverlay) { [searchBar sendSubviewToBack:v]; } }
5.Custom background color
Finally a one-liner
searchBar.tintColor = [UIColor redColor];