Witam ludzi, którzy używają, UISearchController
a następnie dołączają go UISearchBar
do navigationItem.titleView
. Spędziłem szalone 4-5 godzin dnia, aby rozwiązać ten problem. Po iOS 11+ zalecane podejście, które jest oddanie searchController
do navigation.searchController
nie znajduje się tuż za moim przypadku. Ekran, na którym jest to searchController / searchBar, ma niestandardowy backButton.
Przetestowałem to w iOS 10, iOS 11 i 12. Na różnych urządzeniach. Po prostu musiałem. Nie mogę wrócić do domu bez rozwiązania tego demona. To najdoskonalszy, jaki mogłem zrobić dzisiaj, biorąc pod uwagę mój napięty termin.
Więc chcę tylko podzielić się tą ciężką pracą, którą wykonałem, to od Ciebie zależy, czy umieścisz wszystko tam, gdzie chcesz (np. Zmienne w Twoim ViewModel). Oto jest:
Na moim pierwszym ekranie (powiedzmy ekranie głównym, który nie ma tego kontrolera wyszukiwania), mam to w moim viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
Na moim drugim ekranie, tym, który ma searchController, mam to w moim 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
}
a oto moja deklaracja searchControllera:
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
}()
Mam więc nadzieję, że to kiedyś komuś pomoże.