web-dev-qa-db-fra.com

iOS 13 UIBarButtonItem non cliquable et chevauchant UINavigationBars lors de l'utilisation de UISearchController

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.

enter image description here

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)

37
fl034

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:

enter image description here

Et voici à quoi ça ressemble après:

enter image description here

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:

enter image description here

8
matt

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.

6
fl034

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).

3
Ben Gomm

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() }
}
0
senthilvkumar