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'sheaderViewвместо этого весь 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, это спасло бы меня и, возможно, совсем другое замешательство разработчиков и время исследований.

Другие вопросы по тегам