UISearchController searchBar in tableHeaderView animating out of the screen

16,475

Solution 1

Add

self.extendedLayoutIncludesOpaqueBars = YES;

on viewDidLoad method

Solution 2

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;

Solution 3

To make this clearer @Lorenzo's answer worked for me.

self.definesPresentationContext = YES;

Solution 4

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
}

Solution 5

In Swift, try:

override func viewDidLoad() {
    edgesForExtendedLayout = []
    searchController.hidesNavigationBarDuringPresentation = false

    // ...
}
Share:
16,475
Tiago Maia
Author by

Tiago Maia

I'm a back-end developer working with Laravel. I also have experience developing apps for iOS.

Updated on June 14, 2022

Comments

  • Tiago Maia
    Tiago Maia almost 2 years

    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.

    • Lorenzo
      Lorenzo over 9 years
      Did you ever figure out this issue? Currently having a similar problem with my search bar.
    • Tiago Maia
      Tiago Maia over 9 years
      No, Lorenzo. Unfortunately i used the deprecated api for this issue. With storyboards it seems to work in a good manner(i tried the example app from apple), but in the code i got this weird error.
    • Lorenzo
      Lorenzo over 9 years
      Alright thanks anyways. Could you elaborate on the method you used that worked? I've been looking at Apple's example as well and they use storyboards for the table and detail view but all of the search bar components are done in code, is this what you did?
    • Lorenzo
      Lorenzo over 9 years
      Never mind! I just noticed I missed the line self.definesPresentationContext = YES; which ended up being crucial.
    • Brian Sachetta
      Brian Sachetta about 9 years
      See if this previous thread is of any help: stackoverflow.com/questions/28326269/…
  • Vincent Dondain
    Vincent Dondain almost 9 years
    Amazing this is exactly what I was looking for, thanks a lot. Indeed the search bar should be in the navigation bar.
  • Dan
    Dan over 8 years
    This worked for me too, thanks! The obvious question is why?
  • CF_Maintainer
    CF_Maintainer over 8 years
    Worked for me too!. Thanks. The apple example does not even talk about this option.
  • Perjan Duro
    Perjan Duro over 8 years
    Man you are my hero of the day!
  • Echelon
    Echelon about 8 years
    I had a UIView as a container for the search bar, between the nav bar and a table view for results. I had to set self.definesPresentationContext to false to prevent the container from jumping down by about 44 pixels when the search bar was activated.
  • Jonathan Brown
    Jonathan Brown about 8 years
    self.searchController.hidesNavigationBarDuringPresentation = false; fixed it for me as well! Thank you!
  • Echelon
    Echelon about 8 years
    The opposite worked for me! I had a UIView as a container for the search bar, between the nav bar and a table view for results. I had to set self.definesPresentationContext to false to prevent the container from jumping down by about 44 pixels when the search bar was activated.
  • Senry
    Senry almost 8 years
    Working with UITableViewController together with UISearchController, this fixed this issue for me.
  • christijk
    christijk over 7 years
    Perfect..worked for me..! I added searchbar to navigationItem titleview
  • Monica Granbois
    Monica Granbois almost 5 years
    This comment lead me in the right direction to solve my issue. The constraints described in Option B of this SO answer fixed my issue: stackoverflow.com/a/52300159/4704303