Salut aux personnes qui l'utilisent UISearchController
et l'attachent ensuite UISearchBar
au navigationItem.titleView
. J'ai passé 4 à 5 heures de ma journée pour résoudre ce problème. Suivre l'approche recommandée d'iOS 11+, qui consiste à mettre le searchController
à la navigation.searchController
n'est pas juste pour mon cas. L'écran qui a ce searchController / searchBar a un backButton, un personnalisé.
J'ai testé cela dans iOS 10, iOS 11 et 12. Sur différents appareils. Je devais juste le faire. Je ne peux pas rentrer chez moi sans résoudre ce démon. C'est le plus parfait que je puisse faire pour aujourd'hui, compte tenu de mon délai serré.
Donc je veux juste partager ce dur travail que j'ai fait, c'est à vous de tout mettre où vous voulez (ex. Variables dans votre viewModel). Et voilà:
Dans mon premier écran (disons l'écran d'accueil, qui n'a pas ce contrôleur de recherche), j'ai ceci dans mon viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
Dans mon deuxième écran, celui qui a le searchController, j'ai ceci dans mon viewDidAppear
.
override func viewDidAppear (_ animated: Bool) {super.viewDidAppear (animé)
let systemMajorVersion = ProcessInfo.processInfo.operatingSystemVersion.majorVersion
if systemMajorVersion < 12 {
// Place the search bar in the navigation item's title view.
self.navigationItem.titleView = self.searchController.searchBar
}
if systemMajorVersion >= 11 {
self.extendedLayoutIncludesOpaqueBars = true
UIView.animate(withDuration: 0.3) {
self.navigationController?.navigationBar.setNeedsLayout()
self.navigationController?.navigationBar.layoutIfNeeded()
}
self.tableView.contentInset = UIEdgeInsets(top: -40, left: 0, bottom: 0, right: 0)
if self.viewHadAppeared {
self.tableView.contentInset = .zero
}
}
self.viewHadAppeared = true // this is set to false by default.
}
et voici ma déclaration de searchController:
lazy var searchController: UISearchController = {
let searchController = UISearchController(searchResultsController: nil)
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.textField?.backgroundColor = .lalaDarkWhiteColor
searchController.searchBar.textField?.tintColor = .lalaDarkGray
searchController.searchBar.backgroundColor = .white
return searchController
}()
J'espère donc que cela aidera quelqu'un un jour.