Hallo zu den Menschen , die verwendet UISearchController
und dann seine Befestigung UISearchBar
an den navigationItem.titleView
. Ich habe verrückte 4-5 Stunden meines Tages damit verbracht, dies zu lösen. Das Befolgen des von iOS 11+ empfohlenen Ansatzes, der das searchController
auf den Punkt bringt, navigation.searchController
ist nicht nur für meinen Fall richtig. Der Bildschirm mit diesem searchController / searchBar verfügt über einen benutzerdefinierten backButton.
Ich habe dies in iOS 10, iOS 11 und 12 getestet. Auf verschiedenen Geräten. Ich musste einfach. Ich kann nicht nach Hause gehen, ohne diesen Dämon zu lösen. Dies ist das Perfekteste, was ich heute tun kann, angesichts meiner engen Frist.
Ich möchte nur diese harte Arbeit teilen, die ich geleistet habe. Es liegt an Ihnen, alles zu platzieren, wo immer Sie wollen (z. B. Variablen in Ihrem viewModel). Hier kommt's:
In meinem ersten Bildschirm (z. B. Startbildschirm, auf dem dieser Suchcontroller nicht vorhanden ist) habe ich diesen in meinem viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
In meinem zweiten Bildschirm, dem mit dem searchController, habe ich diesen in meinem viewDidAppear
.
überschreiben func viewDidAppear (_ animiert: Bool) {super.viewDidAppear (animiert)
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.
}
und hier ist die Erklärung meines searchControllers:
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
}()
Ich hoffe, das hilft irgendwann jemandem.