Я проверил это на примере проекта с двумя контроллерами представления, определенными в раскадровке с использованием Xcode 11 (iOS 13). «Представляющий» контроллер представления встроен в контроллер навигации и имеет цвета панели навигации, установленные в viewWillAppear
. Контроллер вида «поиск» добавляет UISearchController
в viewDidLoad
и выдвигается контроллером представления (НЕ модальным).
С помощью этой настройки, когда отображается контроллер вида поиска, панель навигации имеет синий фон и красный оттенок, как и ожидалось. Однако при прокрутке вниз и отображении панели поиска цвет фона панели навигации теряется (или изменяется на то, что кажется iOS по умолчанию серым / полупрозрачным). Однако, если вы прокрутите назад вверх (скройте панель поиска) или сосредоточитесь на текстовом поле панели поиска, цвет панели навигации вернется!
Также, если вы сосредоточитесь на текстовом поле панели поиска, а затем отмените (нажав кнопку Отменакнопка) цвет оттенка навигационной панели изменяется с красного на синий для iOS по умолчанию, что можно заметить по элементу задней панели.
Есть предложения по решению этой проблемы?
Я установил цвета панели навигации в viewWillAppear
контроллера поиска, что не изменило этого поведения.
Я установил isTranslucent
в true
для панели навигациив контроллере поиска, который, по-видимому, предотвращал возврат цвета фона, но не изменял возврат цвета оттенка при отмене.
Представление контроллера просмотра
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.barTintColor = .blue
navigationController?.navigationBar.tintColor = .red
}
Поиск в контроллере просмотра
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Search VC"
searchController.dimsBackgroundDuringPresentation = false
searchController.obscuresBackgroundDuringPresentation = false
navigationItem.searchController = searchController
definesPresentationContext = true
}
РЕДАКТИРОВАТЬ
НастройкаscrollEdgeAppearance
, backButtonAppearance
и buttonAppearance
, как было предложено, работает, за исключением кнопок системной панели, которые по умолчанию имеют синий цвет iOS. Эту проблему можно решить, установив UINavigationBar.tintColor, но ни один из них не разрешает цвет шеврона кнопки «Назад», используемый по умолчанию при отмене поиска.
if #available(iOS 13.0, *) {
let buttonAppearance = UIBarButtonItemAppearance()
buttonAppearance.configureWithDefault(for: .plain)
buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.red]
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.configureWithOpaqueBackground()
navigationBarAppearance.backgroundColor = .blue
navigationBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.red]
navigationBarAppearance.backButtonAppearance = buttonAppearance
navigationBarAppearance.buttonAppearance = buttonAppearance
navigationBarAppearance.doneButtonAppearance = buttonAppearance
navigationController?.navigationBar.scrollEdgeAppearance = navigationBarAppearance
navigationController?.navigationBar.compactAppearance = navigationBarAppearance
navigationController?.navigationBar.standardAppearance = navigationBarAppearance
} else {
navigationController?.navigationBar.barTintColor = .blue
navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.red]
navigationController?.navigationBar.tintColor = .red
}