J'ai une barre de navigation contenant des boutons UIBarButtonItem
et un UISearchBar
branché comme ça
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))
}
Scénario: J'appuie sur la barre de recherche et j'appuie ensuite sur Annuler.
Problème 1: Les boutons de la barre ne réagissent pas au toucher, sauf lorsque je touche le plus de pixels extérieurs de l'écran (uniquement possible avec le simulateur et les clics de souris) .
Problème 2: les éléments de navigation se chevauchent lorsque j'appuie sur un autre contrôleur de vue.
Lorsque j'utilise hidesNavigationBarDuringPresentation = true
ça marche comme prévu.
Le problème apparaît sur les iPhones entaillés et non entaillés iOS 13.0 et 13.1 utilisant Xcode 11.0 et 11.1.
Voici l'ensemble du projet de test: https://github.com/fl034/HidesNavigationBarDuringPresentationTest
J'ai déposé un radar (et vous devriez aussi), mais peut-être que certains d'entre vous ont déjà une solution?
Mise à jour 1 : le bogue est toujours là dans iOS 13.1.1
Mise à jour 2 : le bogue est corrigé dans la version bêta d'iOS 13.2 (merci @Ben Gomm)
Le débogueur de vue révèle ce qui se passe avec ce bogue. Le contenu de la barre de navigation est en cours de copie. Voici à quoi ressemble la barre de navigation avant d'afficher la recherche:
Et voici à quoi ça ressemble après:
Les deux vues réplicantes et le UILabel supplémentaire sont le problème. Je ne sais pas ce qu'ils font là-bas et je ne trouve pas de moyen de les supprimer.
[~ # ~] modifier [~ # ~] À propos, je pense que certaines applications d'Apple affichent le même bug. Il est plus facile de voir si vous avez de gros titres, car vous pouvez alors voir le grand titre et l'étiquette supplémentaire en même temps:
J'utilise maintenant cette solution de contournement car je veux que la plupart de mes utilisateurs aient la barre de navigation visible pendant que la recherche est active (pour plusieurs raisons spécifiques à l'application).
var isIosVersionWithNavigationBarBug: Bool {
if #available(iOS 13.2, *) {
return false
}
if #available(iOS 13.0, *) {
return true
}
return false
}
Dans mon contrôleur de recherche, je l'utilise comme ceci
mySearchController.hidesNavigationBarDuringPresentation = isIosVersionWithNavigationBarBug
Donc, si iOS 13.2 est publié et que l'utilisateur le met à jour, la solution de contournement n'est plus appliquée.
Cela semble être corrigé dans iOS 13.2 beta, j'ai testé l'exemple de projet ci-dessus en utilisant Xcode 11.2 beta (11B41).
Pas fier, mais je l'ai fait fonctionner pour l'instant avec ce hack.
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() }
}