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. Элементы навигации перекрываются, когда я нажимаю другой контроллер представления.
Когда я использую hidesNavigationBarDuringPresentation = true
, он работает как ожидалось.
Эта проблема появляется на iPhone с надрезом и без надреза iOS 13.0 и 13.1 с использованием Xcode 11.0 и 11.1.
Вот весь тестовый проект:
https://github.com/fl034/HidesNavigationBarDuringPresentationTest
Я подал радар (и вы тоже должны), но, может быть, некоторые из вас, ребята, уже обошли его?
Обновление: ошибка все еще существует в iOS 13.1.1
Ответы
Ответ 1
Отладчик представления показывает, что происходит с этой ошибкой. Содержимое панели навигации копируется. Вот как выглядит панель навигации перед отображением поиска:
И вот как это выглядит потом:
Проблема с двумя репликантами и дополнительной UILabel. Я не знаю, что они там делают, и я не могу найти способ их удалить.
РЕДАКТИРОВАТЬ Кстати, я думаю, что некоторые приложения Apple отображают ту же ошибку. Проще увидеть, есть ли у вас большие заголовки, потому что тогда вы можете одновременно видеть большой заголовок и дополнительный ярлык:
Ответ 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() }
}