UISearchBar presented by UISearchController in table header view animates too far when active
Ok so I finally figured out a solution for myself. Though it's more than likely we have other things in our code / storyboard (that's why this is a hard question to answer), for the most part I followed Apple's tutorial on UISearchController: (https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html)
Just about all my code is identical to theirs, but I couldn't get the search bar to not jump when clicking inside of it. So what I did was check "under opaque bars" for both the original table view and the search results table view in my storyboard. That got the search bar to stop jumping.
But there was one last issue, which was the fact that the first row of the results table view was hidden by the search bar. In order to fix that I added self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);
to the viewDidLoad
method of my results table view. Voila!
UITableView jumps between positions when activating and deactivating UISearchController
Found the solution after trying various combinations of UITableView
and UIViewController
attributes.
I simply had to set Extends Edges Under Top Bars
to false while keeping the UITableView
constrained to the top of the safe area. The animation is now smooth and follows the UISearchController
as you'd expect.
iOS 9 searchBar disappears from table header view when UISearchController is active
It seems all of us got the same problem but they were solved in different ways. However none of the suggested answers worked for me :(. Nevertheless thank you all for your time.
I got a solution that solved my problem. It is setting Extend Edges - Under Opaque Bars of my (MyModalView: UITableViewController) to true in the Storyboard using Interface Builder.
In summary:
MyModalView: UITableViewController, in Storyboard using Interface Builder has
Extend Edges:
- Under Top Bars ticked
- Under Bottom Bars ticked
- Under Opaque Bars ticked
UISearchController search bar overlap first cell when active
This is how I set up the search bar and things in viewDidLoad (copied from some of apple's examples).
It presents the found results in the same view controller as your unfiltered data is shown. It also has its search bar in the table header that is hidden until it is needed.
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
// we want to be the delegate for our filtered table so didSelectRowAtIndexPath is called for both tables
self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES
self.searchController.searchBar.delegate = self; // so we can monitor text changes + others
// Search is now just presenting a view controller. As such, the normal view controller
// presentation semantics apply. Namely, that presentation will walk up the view controller
// hierarchy until it finds the root view controller or one that defines a presentation context.
//
self.definesPresentationContext = YES; // know where you want UISearchController to be displayed
// Hides search bar initially. When the user pulls down on the list, the search bar is revealed.
[self.tableView setContentOffset:CGPointMake(0, self.searchController.searchBar.frame.size.height)];
My UISearchBar moves to top (animated) -- want to disable
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()
}
UISearchBar overlaps with UITableView content when active
Problem is because of you have automaticallyAdjustsScrollViewInsets = true
please uncheck that
will help :)
Related Topics
Tweening/Interpolating Between Two Cgpaths/Uibeziers
Uitableviewcell with Autolayout Left Margin Different on iPhone and iPad
Auto Layout in Uicollectionviewcell Not Working
Secure Keys in iOS App Scenario, Is It Safe
iOS 10 Error [Access] <Private> When Using Uiimagepickercontroller
Swiftui - How to Avoid Navigation Hardcoded into the View
How to Prevent Uinavigationbar from Covering Top of View in iOS 7
Does Dispatch_Async(Dispatch_Get_Main_Queue(), ^{...}); Wait Until Done
How to Change Inactive Icon/Text Color on Tab Bar
How to Fix the Xcrun Unable to Find Simctl Error
How to Save a Uicolor with Userdefaults
Custom Rounding Corners on Uiview
Keeping a Uibutton Selected After a Touch
Autoshrink on a Uilabel with Multiple Lines
In iOS, How to Create a Button That Is Always on Top of All Other View Controllers
Xcode 5 & Asset Catalog: How to Reference the Launchimage