IOS 13 UIBarButtonItem не активируется и перекрывает UINavigationBars при использовании UISearchController

Я получил панель навигации, содержащую несколько кнопок UIBarButtonItem и UISearchBar, подключенную вот так

var searchController: UISearchController!

override func viewDidLoad() {
    super.viewDidLoad()

    title = "Test"

    tableView.delegate = self
    tableView.dataSource = self

    searchController = UISearchController(searchResultsController: nil)
    navigationItem.searchController = searchController

    // This leads to the bug
    searchController.hidesNavigationBarDuringPresentation = false

    navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(leftTapped))
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(rightTapped))
}

Сценарий. Я нажимаю на панель поиска и затем нажимаю "Отмена".

  • Проблема 1. Кнопки панели не реагируют на прикосновение, за исключением тех случаев, когда я касаюсь большинства внешних пикселей экрана (возможно только при симуляторе и щелчках мыши).

  • Проблема 2. Элементы навигации перекрываются, когда я нажимаю другой контроллер представления.

enter image description here

Когда я использую hidesNavigationBarDuringPresentation = true, он работает как ожидалось.


Эта проблема появляется на iPhone с надрезом и без надреза iOS 13.0 и 13.1 с использованием Xcode 11.0 и 11.1.

Вот весь тестовый проект: https://github.com/fl034/HidesNavigationBarDuringPresentationTest


Я подал радар (и вы тоже должны), но, может быть, некоторые из вас, ребята, уже обошли его?


Обновление: ошибка все еще существует в iOS 13.1.1

Ответ 1

Отладчик представления показывает, что происходит с этой ошибкой. Содержимое панели навигации копируется. Вот как выглядит панель навигации перед отображением поиска:

enter image description here

И вот как это выглядит потом:

enter image description here

Проблема с двумя репликантами и дополнительной UILabel. Я не знаю, что они там делают, и я не могу найти способ их удалить.

РЕДАКТИРОВАТЬ Кстати, я думаю, что некоторые приложения Apple отображают ту же ошибку. Проще увидеть, есть ли у вас большие заголовки, потому что тогда вы можете одновременно видеть большой заголовок и дополнительный ярлык:

enter image description here

Ответ 2

Похоже, что это исправлено в бета-версии iOS 13.2. Я протестировал приведенный выше пример проекта с использованием бета-версии Xcode 11.2 (11B41).

Ответ 3

Не горжусь этим, но я получил это пока с этим хаком.

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    let viewsToRemove = self.navigationController?.navigationBar.subviews.flatMap({ (view) in
        view.subviews.filter { type(of: $0) == UILabel.self }
    })
    viewsToRemove?.forEach { $0.removeFromSuperview() }
}