Почему UISearchController меняет цвета панели навигации? - PullRequest
0 голосов
/ 22 октября 2019

Я проверил это на примере проекта с двумя контроллерами представления, определенными в раскадровке с использованием Xcode 11 (iOS 13). «Представляющий» контроллер представления встроен в контроллер навигации и имеет цвета панели навигации, установленные в viewWillAppear. Контроллер вида «поиск» добавляет UISearchController в viewDidLoad и выдвигается контроллером представления (НЕ модальным).

С помощью этой настройки, когда отображается контроллер вида поиска, панель навигации имеет синий фон и красный оттенок, как и ожидалось. Однако при прокрутке вниз и отображении панели поиска цвет фона панели навигации теряется (или изменяется на то, что кажется iOS по умолчанию серым / полупрозрачным). Однако, если вы прокрутите назад вверх (скройте панель поиска) или сосредоточитесь на текстовом поле панели поиска, цвет панели навигации вернется!

Также, если вы сосредоточитесь на текстовом поле панели поиска, а затем отмените (нажав кнопку Отменакнопка) цвет оттенка навигационной панели изменяется с красного на синий для iOS по умолчанию, что можно заметить по элементу задней панели.

Navigation Bar on Load

Navigation Bar on Search

Focus on Search Bar

Cancel Search Bar

Есть предложения по решению этой проблемы?

Я установил цвета панели навигации в 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, но ни один из них не разрешает цвет шеврона кнопки «Назад», используемый по умолчанию при отмене поиска.

Navigation Bar on Cancel

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
}

1 Ответ

1 голос
/ 22 октября 2019

Однако при прокрутке вниз и отображении панели поиска цвет фона панели навигации теряется

Все это нормально. Новое в iOS 13, расширенная навигационная панель (отображающая панель поиска, большой заголовок и т. Д.) Имеет внешний вид, отличный от обычной навигационной панели. Ваши настройки применяются только к обычной навигационной панели, потому что вы не сделали их способом iOS 13. Если вы хотите, чтобы расширенная навигационная панель выглядела как обычная навигационная панель, вы должны установить ее внешний вид отдельно и явно.

Для этого вам нужно установить навигационную панель scrollEdgeAppearance. Изучите классы UIBarAppearance, UINavigationBarAppearance и UIBarButtonItemAppearance (вам нужно будет явно установить backButtonAppearance).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...