Robin
Robin

Reputation: 117

My UISearchBar moves to top (animated) --> want to disable

I want implement an UISearchBar on my tableView.

My code (in viewDidLoad) :

self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.delegate = self
self.searchController.searchBar.delegate = self
self.searchController.searchBar.autocapitalizationType = .None
self.searchController.searchBar.autocorrectionType = .No

self.searchController.hidesNavigationBarDuringPresentation = false
self.searchController.dimsBackgroundDuringPresentation = false

self.tableView.tableHeaderView = self.searchController.searchBar

When I click on the searchBar, this one move to top, like it wants hide the navigationBar:

When the searchbar is waiting

When I click in the searchbar

I searched on many posts for an answer but nothing works. I want to disable this animation so that the searchBar doesn't move.

Upvotes: 9

Views: 8952

Answers (3)

Zoom
Zoom

Reputation: 151

Paste this line in your viewDidLoad of presenting controller: self.extendedLayoutIncludesOpaqueBars = true

Upvotes: 2

Alex Staravoitau
Alex Staravoitau

Reputation: 2268

You can think of the UISearchController as being presented modally when you start searching. This would work fine if you had a usual UINavigationController setup, however in a more "customized" UI like yours you may run into issues like the search controller attaching to a wrong view, etc.

I would suggest not to use UISearchController in your case and use a separate UISearchBar initialised with the rest of your interface (probably in a storyboard?), and then do the search manually. Implement the UISearchBarDelegate and add your own UITableView for the search results, if you can't simply filter your content in place.

Although looks like you have a tableView var — you could simply add another property, similar to the one you use as a UITableViewDataSource and store filtered data there. So whenever you have something in the UISearchBar you simply use a filtered data source when reloading table view data. For instance:

var data: [String]
var filteredData: [String]

And then use filteredData in the UITableViewDataSource:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filteredData.count
}

...

And then do something like this in the UISearchBarDelegate:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    // Filter the data you have. For instance:
    filteredData = data.filter({$0.rangeOfString(searchText).location != NSNotFound})
    tableView.reloadData()
}

Upvotes: 6

lbarbosa
lbarbosa

Reputation: 2162

You should be able to prevent this by setting:

self.searchController.hidesNavigationBarDuringPresentation = false

Upvotes: 34

Related Questions