Можно ли перезагрузить приложение при смене темного / светлого режима?

Мое приложение широко использует CAGradientLayers, которые, по-видимому, не обновляют свои цвета автоматически при переключении темного / светлого режима. Они будут обновлять свои цвета, когда приложение закрывается и снова открывается.

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

 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        // 
    }

Однако я ищу исправление, которое не требует от меня обновлять каждое представление по отдельности. Есть ли способ обнаружить изменение светлого / темного режима (возможно, в делегате приложения) и заставить все приложение перезагрузиться (как если бы оно было принудительно закрыто и снова открыто)?


person Alec Barton    schedule 24.10.2019    source источник
comment
Возможный дубликат Как проверить темный режим iOS?   -  person Kibo    schedule 24.10.2019
comment
Непонятно, о чем вы могли спросить. Что вообще означает принудительная перезагрузка всего приложения? Что означает более быстрое исправление? Исправлять нечего, и все происходит очень быстро. Вы получаете traitCollectionDidChange, вы перерисовываете свои градиенты, используя альтернативный набор цветов. Apple подробно объяснила это в видеоролике WWDC 2019 по этой теме.   -  person matt    schedule 24.10.2019
comment
developer.apple.com/videos/play/wwdc2019/214/? time = 1393 полностью объясняет это, так что просто посмотрите.   -  person matt    schedule 24.10.2019


Ответы (2)


Таким способом невозможно «перезагрузить приложение». Проблема возникает из-за того, что CAGradientLayer использует CGColor, который динамически не адаптируется к системному стилю.

Я решил проблему, обернув UIView слой градиента, который реализует traitCollectionDidChange, чтобы соответствующим образом обновить цвета градиента. Возможно, вы можете сделать то же самое и использовать это как подпредставление вместо подслоя.

person Frank Schlegel    schedule 24.10.2019

Вы можете создать суперкласс UIViewController, который переопределяет traitCollectionDidChange

person Etienne Jézéquel    schedule 24.10.2019