Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Search bar overlaps with status bar on iOS 11

I am using a UISearchController and a UISearchResultsController to implement search functionality.

MySearchResultsController implements UISearchResultsUpdating and UISearchBarDelegate:

override open func viewDidLoad() {
    super.viewDidLoad()
    self.edgesForExtendedLayout = [];
    self.automaticallyAdjustsScrollViewInsets = false;
}

I display the searchbar in the tableHeader like this in MyTableViewController:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController];
    self.searchController.searchResultsUpdater = self.searchResultsController;
    self.searchController.searchBar.delegate = self.searchResultsController;
    self.searchController.searchBar.scopeButtonTitles = @[NSLocalizedString(@"SEARCH_SCOPE_TEMPERATURES", nil), NSLocalizedString(@"SEARCH_SCOPE_KNOWHOW", nil)];
    self.tableView.tableHeaderView = self.searchController.searchBar;
    self.definesPresentationContext = YES;
}

This worked perfectly before, but under iOS 11 the search bar overlaps with the status bar as soon as I tap into it (see screenshots). I tried lots of different things to get it to display correctly but haven't found a solution yet.

enter image description here

like image 348
Stefan Avatar asked Sep 19 '17 08:09

Stefan


2 Answers

I found that the problem was that the presenting view Controller also sets

override open func viewDidLoad() {
    super.viewDidLoad()
    self.edgesForExtendedLayout = [];
    self.automaticallyAdjustsScrollViewInsets = false;
}

I have to do this because the table view does not actually extend all the way to the top.

I solved this like that in my presenting view Controller:

override open func viewDidLoad() {
    super.viewDidLoad()
    self.automaticallyAdjustsScrollViewInsets = false;
    if (@available(iOS 11.0, *)) {
        //NSLog(@"iOS 11.0");
    } else {
        self.edgesForExtendedLayout = UIRectEdgeNone;
        //NSLog(@"iOS < 11.0");
    }
}

Seems to be an iOS 11 bug, or at least an odd behavior…

like image 50
Stefan Avatar answered Oct 19 '22 16:10

Stefan


This is what Worked for me:

    override func viewDidLoad() {
        // to fix the Status Bar Issue:
        if #available(iOS 11.0, *) {
            definesPresentationContext = true
        }
       // You'll also need this properties on your Search Bar:
        searchController = UISearchController.init(searchResultsController: nil)
        searchController?.searchResultsUpdater = self
        searchController?.hidesNavigationBarDuringPresentation = false
    }
like image 22
Hernan Arber Avatar answered Oct 19 '22 17:10

Hernan Arber