Виджет iOS 14 - getTimeline - определение светлого и темного режима

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

я пытался

struct WidgetProvider: IntentTimelineProvider {

    @Environment(\.colorScheme) var colorScheme

    func getTimeline(
       for configuration: MyConfigurationIntent,
       in context: Context,
       completion: @escaping (Timeline<Entry>) -> Void
    ) {
        //colorScheme is never equal to .dark
    }
}

Если я использую let darkMode = UITraitCollection.current.userInterfaceStyle == .dark вместо colorScheme, он работает, но только один раз. Если я меняю режим и виджет перезагружается, он все еще использует старый цветовой режим.

Как правильно определить режим?


person Martin Perry    schedule 26.02.2021    source источник
comment
Думаю, ваши виджеты не перезагружаются. Извините, если это неверно, я новичок в виджетах, но я почти уверен, что они перезагружаются с очень большой периодичностью. Вы можете посмотреть, как можно перезагружать виджет каждый раз, когда он появляется.   -  person Todd    schedule 26.02.2021
comment
Я знаю, но даже если срабатывает перезагрузка, они остаются некорректными.   -  person Martin Perry    schedule 26.02.2021


Ответы (1)


Во-первых, переменные @Environment можно использовать только в представлениях SwiftUI. Вы не можете использовать их в IntentTimelineProvider.

Затем вы правильно попробовали альтернативный метод colorScheme обнаружения:

let darkMode = UITraitCollection.current.userInterfaceStyle == .dark

Загвоздка в том, что при изменении внешнего вида записи (и сама шкала времени) не восстанавливаются. Перерисовывается только вид.

Лучшая возможность - использовать @Environment(\.colorScheme) прямо в представлении. Смотрите этот ответ:

Если вам действительно нужно создать зависимые от цветовой схемы переменные на временной шкале, я предлагаю вам создать их для обеих цветовых схем и условно отображать в представлении на основе @Environment(\.colorScheme).

person pawello2222    schedule 26.02.2021
comment
Я знаю, что он не вызывается при смене режима. Однако он не обновляется, даже если getTimeline вызывается после тайм-аута. - person Martin Perry; 26.02.2021
comment
@MartinPerry Похоже, UITraitCollection не работает в виджетах (возможно, потому, что это из UIKit). Это означает, что вам нужно использовать @Environment(\.colorScheme) в представлении. - person pawello2222; 26.02.2021