在iOS11的tableHeaderView中使用UISearchController和UISearchBar
有没有人成功保留UISearchBar
在UITableView
在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议么?