Привіт людям, які використовують, UISearchController
а потім додають його UISearchBar
до navigationItem.titleView
. Я витратив на це божевільні 4-5 годин дня, щоб це вирішити. Після КСН 11+ рекомендується підхід, який є прийняття searchController
вnavigation.searchController
це не просто підходить для мого випадку. Екран, на якому є цей searchController / searchBar, має спеціальну кнопку backButton.
Я тестував це на iOS 10, iOS 11 та 12. На різних пристроях. Я просто мусив. Я не можу повернутися додому, не вирішивши цього демона. Це найдосконаліше, що я міг зробити на сьогодні, враховуючи мій обмежений термін.
Тож я просто хочу поділитися цією важкою працею, яку я зробив, це від вас залежить, щоб ви розмістили все туди, куди завгодно (наприклад, змінні у вашому viewModel). Ось справа:
На моєму першому екрані (скажімо, на головному екрані, який не має цього контролера пошуку), я маю це в своєму viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
На моєму другому екрані, на тому, який має searchController, я маю це в своєму viewDidAppear
.
перевизначити функцію viewDidAppear (_ анімований: Bool) {super.viewDidAppear (анімований)
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
}
і ось декларація мого 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
}()
Тож я сподіваюся, це колись допоможе комусь.