Как вы можете разрешить пользователю переходить в темный или светлый режим с открытым приложением на iOS? - PullRequest
0 голосов
/ 01 марта 2020

Я обновил представления в своем приложении для поддержки темного режима, добавив

        if #available(iOS 12.0, *) {
           if self.traitCollection.userInterfaceStyle == .dark {
               //Adapt to dark Bg
           } else {
                //Adapt to light Bg
            }
        }

Затем, чтобы учесть случай, когда пользователь оставляет фон приложения и возвращается к нему после переключения режима, я присоединяю наблюдателя в моем viewDidLoad

        if #available(iOS 12.0, *) {
            NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
        } else {
            // Fallback on earlier versions
        }

, который вызывает функцию

    @available(iOS 12.0, *)
    @objc func willEnterForeground() {
        if self.traitCollection.userInterfaceStyle == .dark {
            print("App moving to foreground - dark")
            //Adapt to dark Bg
        } else {
            print("App moving to foreground - light")
            //Adapt to light Bg
        }
    }

Тем не менее, self.traitCollection.userInterfaceStyle по-прежнему дает старое значение, поэтому полная перезагрузка представления требуется, чтобы произвести желаемое обновление для интерфейс. Использование UIApplication.didBecomeActiveNotification вместо этого не имеет значения.

1 Ответ

3 голосов
/ 01 марта 2020

Вам не нужны все эти грязные заявления! Просто добавьте свои цвета в свой каталог активов, и правильный будет автоматически выбран. Это похоже на то, как вы можете добавить x1, x2 и x3 изображения, и будет выбрано правильное изображение.

Go в Каталог активов и в левом нижнем углу нажмите на нажмите кнопку «плюс», выберите «Новый набор цветов»:

enter image description here

Дайте цвету имя, а в инспекторе свойств установите для «Внешний вид» значение «». Любой, Темный ":

enter image description here

Выберите цвет для каждого внешнего вида:

enter image description here

Наконец, используйте инициализатор UIColor(named:) для инициализации цветов, и они автоматически изменятся при изменении настроек темного режима устройства:

someView.backgroundColor = UIColor(named: "myColor")

РЕДАКТИРОВАТЬ:

Если цвета только известный во время выполнения, вы можете использовать инициализатор init(dynamicProvider:) (только для iOS 13):

someView.backgroundColor = UIColor {
    traits in
    if traits.userInterfaceStyle == .dark {
        // return color for dark mode
    } else {
        // return color for light mode
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...