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

时间:2017-09-15 12:23:59

标签: ios swift uinavigationbar uisearchbar ios11

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

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

请参阅以下图像序列:

Initial table state Filtered table with search Collapsed search bar on pop

最终图像显示在pop segue期间表格的出现,以便从呈现的视图控制器返回到带有搜索栏的表格。奇怪的是,这并不总是总是发生。它发生在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)
}

我也在Apple的消息应用程序中看到了这个问题(见下面的截图),以及设置,便笺和邮件,所以这可能是iOS 11的错误。

Messages app search bar squashed on pop

仅在设置中使用小于默认文本大小时才会出现这种情况 - >一般 - >辅助功能 - >较大的文本,似乎只发生在物理设备上(避免在模拟器中复制它)。在viewDidAppear中,searchController.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)
}

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

1 个答案:

答案 0 :(得分:1)

此错误可在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;
    }
}

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

相关问题