stackoverflow.com/a/46908553/7848589
ибудь успешно сохранилUISearchBar
вtableHeaderView
изUITableView
в ios11? Проблемы обычно возникают с iPhone X в ландшафте:
Apple рекомендует использовать новыйsearchController
свойство:
if (@available(iOS 11.0, *)) {
self.navigationItem.searchController = self.searchController;
self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
self.tableView.tableHeaderView = self.searchController.searchBar;
}
Однако это не всегда работает. Вот пример с кодом:
iOS11 UISearchBar отсутствует в UINavigationBar при встраивании в UISplitViewController
Таким образом, пытаясь сохранитьsearchBar
вtableHeaderView
- практическим первым шагом является применение соответствующих ограничений автоматического макета:
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
.
Почему это так сложно?
Одним из решений является сохранение поиска, отключениеUISearchController
после поворота и снова включите его с сохраненным поиском. Это работает, но это не должно быть таким сложным.
Какие-либо предложения?