UISearchController.hidesNavigationBarDuringPresentation игнорируется с помощью scopeButtons в iOS 11 Beta
В нашем проекте мы указали, что
hidesNavigationBarDuringPresentation = false
на конкретном UIViewController
"s UISearchController
, SearchController имеет массив заголовков областей. До сих пор это прекрасно работает до iOS 10, но в бета-версиях iOS 11 похоже, что ложное значение hidesNavigationBarDuringPresentation игнорируется и портит наш дисплей. Чтобы убедиться, что это не из-за других факторов в моем проекте, я создал тестовый проект с одним UITableViewController
с UISearchController
инициализируется с другим простым UITableViewController
, Следующий код находится в viewDidLoad()
метод на главном контроллере вида:
self.title = "Search Bar Scope Test"
let searchViewController = SearchViewController(style: .plain)
searchController = UISearchController(searchResultsController: searchViewController)
searchController!.searchBar.sizeToFit()
tableView.tableHeaderView = searchController!.searchBar
searchController?.hidesNavigationBarDuringPresentation = false
searchController?.searchBar.scopeButtonTitles = ["scope 1", "scope 2", "scope 3", "scope 4", "scope 5"]
Когда последняя строка назначения scopeButtonTitles
отсутствует, панель навигации не спряталась, и панель поиска остается в исходном положении. Однако с этой линией NavigationBar
становится скрытым и searchBar
Кроме того, кнопки увеличения и увеличения перемещаются вверх в портретном режиме как на iPhone, так и на iPad, но остаются неизменными в горизонтальном режиме (даже если кнопок области видимости много и они не могут поместиться в одну строку).
Кто-нибудь еще сталкивался с этим? Это ошибка или ожидаемое поведение (конечно, не наше желаемое поведение) в iOS 11, и есть ли обходной путь?
Спасибо!
1 ответ
Хорошо, нашел причину проблемы, пока я изучал другую связанную проблему, что searchBar
и кнопка области действия была выровнена неправильно в iOS 11. Ключевым моментом является то, что схема конфигурации searchController изменилась в iOS 11, где searchBar
больше не должен быть представлен как tableView's
headerView
вместо этого весь searchController должен быть частью navigationItem
, как показано ниже:
if #available(iOS 11.0, *) {
self.navigationItem.searchController = searchController
// optional, but apparently due to a bug in iOS 11,
// the searchBar and the scope buttons may get too high and mis-aligned
// when the nav bar is hidden
searchController?.hidesNavigationBarDuringPresentation = false
} else {
tableView.tableHeaderView = searchController!.searchBar
}
Приведенный выше код исправил несколько проблем с пользовательским интерфейсом, которые у меня были связаны с UISearchBar в iOS 11, и на самом деле рекомендуется в этом видео WWDC 2017, но как бы я хотел, чтобы Xcode мог дать нам предупреждение в старой строке назначения tableHeaderView, это спасло бы меня и, возможно, совсем другое замешательство разработчиков и время исследований.