Xin chào những người sử dụng UISearchController
và sau đó gắn nó UISearchBar
vàonavigationItem.titleView
. Tôi đã dành 4-5 giờ điên cuồng trong ngày để giải quyết vấn đề này. Sau khi iOS 11 + cách tiếp cận đề nghị, được đặt searchController
vào navigation.searchController
không chỉ phù hợp với trường hợp của tôi. Màn hình có searchController / searchBar này có backButton, một tùy chỉnh.
Tôi đã thử nghiệm điều này trong iOS 10, iOS 11 và 12. Trên các thiết bị khác nhau. Tôi chỉ cần phải. Tôi không thể về nhà mà không giải được con quỷ này. Đây là điều hoàn hảo nhất mà tôi có thể làm cho ngày hôm nay, với thời hạn eo hẹp của tôi.
Vì vậy, tôi chỉ muốn chia sẻ công việc khó khăn này mà tôi đã làm, tùy thuộc vào bạn để đưa mọi thứ vào bất cứ nơi nào bạn muốn (ví dụ: các biến trong viewModel của bạn). Nó đi từ đây:
Trong màn hình đầu tiên của tôi (giả sử màn hình chính, không có bộ điều khiển tìm kiếm này), tôi có cái này trong của tôi viewDidLoad()
.
self.extendedLayoutIncludesOpaqueBars = true
Trong màn hình thứ hai của tôi, cái có searchController, tôi có cái này trong của tôi viewDidAppear
.
ghi đè func viewDidAppear (_ animation: Bool) {super.viewDidAppear (hoạt hình)
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
}
và đây là khai báo của tôi 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
}()
Vì vậy, tôi hy vọng điều này sẽ giúp ai đó một ngày nào đó.