在iOS 11上,导航项中的搜索栏折叠并在导航弹出时卡在状态栏下方

And*_*net 5 uinavigationbar uisearchbar ios swift ios11

我正在使用的新的iOS 11 searchContoller属性UINavigationItem。我正在运行iOS 11.0 GM版本。

当我在搜索控制器处于活动状态时执行推送搜索时,它可以正常工作。当我随后弹出时,搜索栏将折叠起来,并压在状态栏中。然后,我无法取消搜索或编辑搜索文本。

请参阅以下图像序列:

初始表状态带搜索的过滤表弹出式折叠的搜索栏

最终的图像显示了弹出搜索期间表格的外观,该外观从显示的视图控制器返回到带有搜索栏的表格。奇怪的是,这并不总是发生。它有90%的时间会发生,但有时表现良好。我尚未弄清楚我正在做些什么来使其正常工作。搜索栏被压扁后,我必须强制关闭该应用程序以返回到明智状态。

设置搜索控制器的代码非常标准。相关的位viewDidLoad()如下:

searchController = UISearchController(searchResultsController: nil)
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.returnKeyType = .done
searchController.searchBar.placeholder = "Your Library"
searchController.searchBar.searchBarStyle = .minimal

// We will manage the clearing of selections ourselves.
clearsSelectionOnViewWillAppear = false

// Some search bar styles are slightly different on iOS 11
if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
    navigationController!.navigationBar.prefersLargeTitles = true
}
else {
    searchController.searchBar.backgroundColor = tableView.backgroundColor!
    searchController.hidesNavigationBarDuringPresentation = false
    tableView.tableHeaderView = searchController.searchBar
    tableView.setContentOffset(CGPoint(x: 0, y: searchController.searchBar.frame.height), animated: false)
}
Run Code Online (Sandbox Code Playgroud)

我还在Apple的Messages应用程序中注意到了此问题(请参见下面的屏幕快照),以及Settings,Notes和Mail,因此大概是iOS 11的一个错误。

邮件应用搜索栏被弹出

仅在“设置”->“常规”->“辅助功能”->“较大的文本”中使用小于默认的“文本大小”时,才会出现这种情况,并且似乎仅在物理设备上发生(在模拟器中未复制)。在viewDidAppearsearchController.searchBar.frame.height等于0(但不是在viewDidDisappear,不viewWillAppear)。到目前为止,我唯一的解决方法是:

override func viewDidAppear(_ animated: Bool) {
    if #available(iOS 11.0, *), searchController.searchBar.frame.height == 0 {
        navigationItem.searchController?.isActive = false
    }

    super.viewDidAppear(animated)
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来解决此问题?

Nik*_*nov 2

这个bug可以在iOS 11.1中重现:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.hidesSearchBarWhenScrolling = NO;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if (@available(iOS 11.0, *)) {
        self.navigationItem.hidesSearchBarWhenScrolling = YES;
    }
}
Run Code Online (Sandbox Code Playgroud)

避免 VC 生命周期事件上的 mutate navigationItem,解决了我的问题