Привет тем, кто использует, UISearchController
а затем прикрепляет его UISearchBar
к navigationItem.titleView
. Я потратил безумные 4-5 часов в день, чтобы решить эту проблему. После IOS 11+ рекомендуется подход, который является принятие searchController
на navigation.searchController
не только для моего случая. Экран с этим searchController / searchBar имеет настраиваемую кнопку backButton.
Я тестировал это в iOS 10, iOS 11 и 12. На разных устройствах. Мне просто пришлось. Я не могу пойти домой, не разгадав этого демона. Это лучшее, что я мог сделать на сегодня, учитывая мои сжатые сроки.
Итак, я просто хочу поделиться этой тяжелой работой, которую я проделал, вам решать, где вы хотите поместить все, где хотите (например, переменные в вашей модели просмотра). Вот оно:
На моем первом экране (скажем, на главном экране, на котором нет этого контроллера поиска) у меня есть это в моем viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
На моем втором экране, на котором есть searchController, у меня это в моем viewDidAppear
.
переопределить функцию viewDidAppear (_ animated: 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
}()
Так что я надеюсь, что это когда-нибудь поможет кому-нибудь.