Ciao alla gente che utilizza UISearchController
e quindi collegare la sua UISearchBar
al navigationItem.titleView
. Ho speso 4-5 ore folli della mia giornata per risolvere questo problema. In seguito alla iOS 11+ raccomandato approccio, che sta mettendo la searchController
alla navigation.searchController
non è giusto per il mio caso. La schermata che ha questo searchController / searchBar ha un backButton, uno personalizzato.
L'ho testato su iOS 10, iOS 11 e 12. In diversi dispositivi. Ho solo dovuto. Non posso tornare a casa senza risolvere questo demone. Questo è il massimo che potrei fare per oggi, data la mia stretta scadenza.
Quindi voglio solo condividere questo duro lavoro che ho fatto, sta a te mettere tutto dove vuoi (es. Variabili nel tuo viewModel). Eccolo:
Nella mia prima schermata (ad esempio schermata iniziale, che non ha questo controller di ricerca), ho questo nel mio file viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
Nella mia seconda schermata, quella che ha il searchController, ho questo nel mio viewDidAppear
.
override func viewDidAppear (_ animated: Bool) {super.viewDidAppear (animated)
let systemMajorVersion = ProcessInfo.processInfo.operatingSystemVersion.majorVersion
if systemMajorVersion < 12 {
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
}
ed ecco la mia dichiarazione di 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
}()
Quindi spero che questo aiuti qualcuno un giorno.