Dans iOS 13, le comportement a changé de sorte que, par défaut, lorsque le contrôleur de navigation apparaît, la barre de recherche est visible (lorsque UISearchController
est affecté à un navigationItem.searchController
). Certaines applications système apparaissent avec la barre de recherche cachée (vous devez balayer vers le bas pour qu'elle apparaisse), mais je ne vois aucune propriété spécifique qui permettrait cela. Comment y parvenir - peut-être existe-t-il une propriété ou une méthode pour le faire?
Par expérimentation, j'ai découvert que si vous retardez l'attribution du contrôleur de recherche à l'élément de navigation jusqu'à viewWillLayoutSubviews
ou viewDidLayoutSubviews
, le contrôleur de recherche commence caché, comme vous le souhaitez. Cependant, si vous le faites sur iOS 12 ou une version antérieure, le contrôleur de recherche ne sera pas révélé lors du défilement vers le bas.
J'ai fini par faire ce qui suit avec une vérification de version en désordre, qui fonctionne pour moi:
override func viewDidLoad() {
super.viewDidLoad()
searchController = /* make search controller... */
if #available(iOS 13, *) {
// Attaching the search controller at this time on iOS 13 results in the
// search bar being initially visible, so assign it later
}
else {
navigationItem.searchController = searchController
}
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
navigationItem.searchController = searchController
}
Je trouve que cela fonctionne:
self.searchController.searchBar.hidden = YES;
Vous devrez dévoiler au moment opportun.
Swift 5.2 et iOS 13.3.1: -
Essayez comme ça. Ça fonctionne bien
navigationItem.hidesSearchBarWhenScrolling = false
J'ai réussi à faire ce travail en définissant isTransculent
false
sur le navigationBar
et en ayant les données initiales sur UITableView
ou UICollectionView
. Si vous avez initialement 0 cellule et déclenchez reloadData
après un certain temps (peut-être un appel réseau), SearchBar est visible initialement. Ayez donc une cellule factice ou quelque chose de similaire au début et chargez les données plus tard, si c'est le cas pour vous.
navigationController?.navigationBar.isTranslucent = false