在iOS11的tableHeaderView中使用UISearchController和UISearchBar

有没有人成功保留UISearchBarUITableView在ios11 tableHeaderView ? iPhone X在横向上通常会出现问题:

在这里输入图像说明

Applebuild议使用新的searchController属性:

 if (@available(iOS 11.0, *)) { self.navigationItem.searchController = self.searchController; self.navigationItem.hidesSearchBarWhenScrolling = NO; } else { self.tableView.tableHeaderView = self.searchController.searchBar; } 

但是,这并不总是奏效。 这是一个代码示例:

embedded到UISplitViewController中时,iOS11 UISearchBar在UINavigationBar中丢失

所以试图在tableHeaderView保留searchBar – 实际的第一步是应用适当的自动布局约束:

 if (@available(iOS 11.0, *)) { UILayoutGuide *guide = self.tableView.safeAreaLayoutGuide; searchBar.translatesAutoresizingMaskIntoConstraints = NO; [searchBar.leftAnchor constraintEqualToAnchor:guide.leftAnchor].active = YES; [searchBar.rightAnchor constraintEqualToAnchor:guide.rightAnchor].active = YES; } 

searchBar在显示时大小正确:

在这里输入图像说明

但是,当UISearchBar被激活时会出现问题:

在这里输入图像说明

这似乎是一个老问题。 有关于这样的问题的许多计算器问题和答案。 在这种情况下,检查视图层次结构时,显示UISearchBar的宽度设置不正确。 所以这可以纠正:

 - (void)didPresentSearchController:(UISearchController *)searchController NS_AVAILABLE_IOS(11_0) { if (@available(iOS 11.0, *)) { CGRect frame = self.searchController.searchBar.frame; frame.size.width = [self safeWidthAvailable]; self.searchController.searchBar.frame = frame; } } - (CGFloat)safeWidthAvailable { CGRect frame = ((AppDelegate *)MyApplication.sharedApplication.delegate).window.frame; CGFloat width = frame.size.width; if (@available(iOS 11.0, *)) { UIEdgeInsets insets = ((AppDelegate *)MyApplication.sharedApplication.delegate).window.safeAreaInsets; width -= insets.left; width -= insets.right; } return width; } 

所以这个工作:

在这里输入图像说明

直到你旋转UISearchController活动:

在这里输入图像说明

所以再次UISearchController错位UISearchBar

为什么这么难?

一个解决scheme是保存search,旋转后禁用UISearchController ,并使用保存的search重新启用它。 这有效,但不应该太复杂。

有什么build议么?