Olá para as pessoas que usam UISearchController
e, em seguida, anexando-as UISearchBar
ao navigationItem.titleView
. Eu gastei 4-5 horas loucas do meu dia para resolver isso. Após o iOS 11+ abordagem recomendada, que é colocar o searchController
à navigation.searchController
não é apenas adequado para o meu caso. A tela que tem esse searchController / searchBar tem um backButton, customizado.
Eu testei isso no iOS 10, iOS 11 e 12. Em diferentes dispositivos. Eu apenas tive que fazer. Não posso ir para casa sem resolver esse demônio. Isso é o mais perfeito que eu poderia fazer hoje, devido ao meu prazo apertado.
Então, eu só quero compartilhar este trabalho árduo que fiz, cabe a você colocar tudo onde quiser (ex. Variáveis em seu viewModel). Aqui vai:
Na minha primeira tela (digamos tela inicial, que não tem esse controlador de pesquisa), tenho isso na minha viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
Na minha segunda tela, aquela que contém o searchController, tenho isso na minha viewDidAppear
.
substituir função viewDidAppear (_ animated: Bool) {super.viewDidAppear (animado)
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.
}
e aqui está a declaração de meu 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
}()
Espero que algum dia isso ajude alguém.