I have a UISearchController
with a UITableViewController
as a searchResultsController
, the UISearchBar
of this searchController
is set to be in the tableHeaderView
of my current tableView
displayed in my root ViewController. Almost everything is working well, as expected. But in the animation of the UISearchBar
(When i click on the searchBar and the UINavigationBar
hides and the searchBar goes to the top, as in the UISearchDisplayController
) i have a strange behavior. Instead of moving to the position of the UINavigationBar
(y: 0), it jumps out of the screen and than starts the animation that shows the cancel button. I tried moving my instantiate code to the viewDidLoad
instead of init
, and the things are just the same. I think that the center of the problem is in the frame of the searchResultsController
's view, but i'm not sure about that(I tried setting the frame, without success). Everything that i am doing is in pure code.
Here is the relevant part of the code:
- (void) viewDidLoad {
[super viewDidLoad];
// search controller setup
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController];
self.searchController.delegate = self;
self.searchController.searchResultsUpdater = self;
self.searchController.searchBar.delegate = self;
[self.searchController.searchBar sizeToFit];
self.tableView.tableHeaderView = self.searchController.searchBar;
self.searchController.definesPresentationContext = YES;
}
And i have a lazy load for the searchResultsController
:
- (UITableViewController *)searchResultsController {
if (_searchResultsController == nil) {
_searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
_searchResultsController.tableView.delegate = self;
_searchResultsController.tableView.dataSource = self;
}
return _searchResultsController;
}
I've downloaded the sample code from apple, but they use storyBoards and a xib for UITableViewCell, the SearchController works perfectly in the project. Does anyone had the same problem? How can i fix this? Any solutions or suggestions would be appreciated.
Thanks for the attention.
Add
self.extendedLayoutIncludesOpaqueBars = YES;
on viewDidLoad
method
Have you tried to set the hidesNavigationBarDuringPresentation to false? Solved my headache..
self.searchController.hidesNavigationBarDuringPresentation = false;
Putting the searchbar in the navigation bar gives a more solid user experience in my opinion (for iphone)
self.navigationItem.titleView = self.searchController.searchBar;
To make this clearer @Lorenzo's answer worked for me.
self.definesPresentationContext = YES;
Try this out:
First you need to delegate the
UISearchControllerDelegate
For Swift
func willPresentSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = true
}
func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.translucent = false
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With