Как установить цвет большого заголовка в темном режиме iOS 13?

В своем приложении я использую

let navigationBar = UINavigationBar.appearance()
navigationBar.largeTitleTextAttributes = [
    NSAttributedString.Key.font: UIFont.SFProDisplay(ofSize: 34, weight: .bold),
    NSAttributedString.Key.foregroundColor: UIColor.custom
]

static var custom: UIColor {
    return UIColor(named: "color_custom")!
}

набор цветов

где есть набор цветов color_custom. Но при переключении между цветовыми режимами использовался только цвет Any Appearance. Темное оформление не используется. Почему?

ДОПОЛНЕНИЕ:

После некоторого исследования я решил, что это должно добавить к следующему вопросу: в моем приложении я использую переключатель для переключения между режимами. Storage.isDarkModeOn = newState // saving in user defaults. Потом:

class PapaViewController: UIViewController {
    if #available(iOS 13.0, *) {
        overrideUserInterfaceStyle = Storage.isDarkModeOn ? .dark : .light
    }
}

Где PapaViewController - родительский класс для всех UIViewController в моем приложении. Итак, если overrideUserInterfaceStyle == .dark и цветовой режим устройства == .light, ошибка обнаруживается. Если затем я изменю цветовой режим устройства на .dark, то большой заголовок будет выглядеть так, как ожидалось.


person Nik Kov    schedule 01.10.2019    source источник
comment
Ваш код работает. Вы не забыли вызвать функцию appearance?   -  person Mojtaba Hosseini    schedule 01.10.2019
comment
@MojtabaHosseini нет. По мере необходимости он работает в светлом режиме.   -  person Nik Kov    schedule 01.10.2019
comment
Не могу воспроизвести. Большой заголовок меняет цвета очень хорошо. Пожалуйста, покажите достаточно кода в контексте, чтобы можно было воспроизвести проблему, а не только небольших фрагментов, которые, как вы думаете, достаточно.   -  person matt    schedule 01.10.2019
comment
@matt что еще тебе нужно? Это только код, относящийся к проблеме, помещенный в applicationDidFinishLaunching.   -  person Nik Kov    schedule 02.10.2019
comment
Что еще нужно вам? Вы бы хотели, чтобы я опубликовал пример проекта, доказывающий, что ваш код работает нормально? Я имею в виду, конечно, я не знаю, что означает UIFont.SFProDisplay, но все остальное я могу просто скопировать и использовать напрямую, и большой заголовок изменит цвет, как и ожидалось. (Вместо этого я использовал шрифт Georgia.)   -  person matt    schedule 02.10.2019
comment
Вот и все: github.com/mattneub/LargeTitleTest Загрузить. Бег. Переключение между темным и светлым режимами. Смотреть.   -  person matt    schedule 02.10.2019
comment
@matt спасибо за ваше время. Я добавил дополнительные пояснения к вопросу.   -  person Nik Kov    schedule 03.10.2019


Ответы (2)


Проблема с кодом, который вы показали сейчас, заключается просто в том, что вы разговариваете не с тем контроллером представления. Это не ваш контроллер представления (self), override который вам нужно изменить: это корневой контроллер представления, который в данном случае, вероятно, является контроллером навигации.

class PapaViewController: UIViewController {
    if #available(iOS 13.0, *) {
        self.navigationController?.overrideUserInterfaceStyle = // ...
    }
}
person matt    schedule 03.10.2019
comment
Я обновил github.com/mattneub/LargeTitleTest для демонстрации. - person matt; 03.10.2019

Вы пробовали использовать новый API внешнего вида iOS 13?

https://developer.apple.com/documentation/uikit/uinavigationbarappearance.

Пример:

let style = UINavigationBarAppearance()
style.largeTitleTextAttributes = [.font: #YOURFONT#]

navigationController?.navigationBar.standardAppearance = style
navigationController?.navigationBar.scrollEdgeAppearance = ...
navigationController?.navigationBar.compactAppearance = ...
person Ash Cameron    schedule 02.10.2019