Hai orang-orang yang menggunakan UISearchController
dan kemudian melampirkan nya UISearchBar
ke navigationItem.titleView
. Saya telah menghabiskan 4-5 jam hari saya yang gila untuk menyelesaikan ini. Mengikuti pendekatan yang direkomendasikan iOS 11+, yang menempatkan searchController
kenavigation.searchController
tidak tepat untuk kasus saya. Layar yang memiliki searchController / searchBar ini memiliki backButton, kustom.
Saya telah menguji ini di iOS 10, iOS 11, dan 12. Di perangkat yang berbeda. Saya hanya harus. Saya tidak bisa pulang tanpa memecahkan iblis ini. Ini adalah yang paling sempurna yang bisa saya lakukan untuk hari ini, mengingat tenggat waktu saya yang ketat.
Jadi saya hanya ingin berbagi kerja keras yang saya lakukan ini, terserah Anda untuk meletakkan semuanya di mana pun Anda inginkan (mis. Variabel di viewModel Anda). Ini dia:
Di layar pertama saya (katakanlah layar beranda, yang tidak memiliki pengontrol pencarian ini), saya memiliki ini di viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
Di layar kedua saya, yang memiliki searchController, saya memiliki ini di 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
}
dan inilah deklarasi searchController saya:
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
}()
Jadi saya harap ini membantu seseorang suatu hari nanti.