搜索控制器中的搜索栏重叠状态栏

Search bar overlapping status bar in search controller

我在 UITableViewController 中以编程方式创建了一个 UISearchController。它工作正常,但搜索栏无法正确显示状态栏。这是我的代码和一些屏幕截图。它还在取消搜索时制作了一个有趣的动画。

- (void)viewDidLoad
{
    [super viewDidLoad];

    _resultsTableViewController = [ResultsTableViewController new];
    _searchController = [[UISearchController alloc] initWithSearchResultsController:_resultsTableViewController];
    _searchController.searchResultsUpdater = _resultsTableViewController;
    _searchController.dimsBackgroundDuringPresentation = NO;
    self.definesPresentationContext = YES;
    self.tableView.tableHeaderView = _searchController.searchBar;       
}

这里的状态栏应该有更多的填充。

当您取消搜索时,我会在此处看到一个糟糕的动画,即状态栏的高度。

从您的屏幕截图看来,您正在使用 iOS 11,在此版本中,UISearchController 搜索栏添加到 UI 的方式已更改。 iOS 11 是负责显示搜索的导航项,因此 UIKit 尚未更新以正确处理 table header 视图中显示的搜索栏。

在iOS ≤10 你应该继续使用

self.tableView.tableHeaderView = _searchController.searchBar;

但切换到

self.navigationItem.searchController = _searchController;
self.navigationItem.hidesSearchBarWhenScrolling = YES;

在 iOS 11 及以后。

只是一个快速的附加警告,除非您指定不希望它隐藏 NavBar,否则 searchBar 可能仍会在版本 < iOS 11 上消失 例如

    if (@available(iOS 11.0, *)) {
        self.navigationItem.searchController = self.mySearchController;
        self.navigationItem.hidesSearchBarWhenScrolling = YES;
    } else {
        // Fallback on earlier versions
        self.tableView.tableHeaderView = self.mySearchController.searchBar;       // show the SearchBar in TV header
        self.mySearchController.hidesNavigationBarDuringPresentation = NO;
    }