Пользовательский цвет акцента SwiftUI не работает на физическом устройстве (iOS 13), но работает везде (iOS 14.0 )

#swift #image #colors #swiftui #assets

#swift #изображение #Цвет #swiftui #ресурсы

Вопрос:

В моем SwiftUI View у меня Image есть то, что я загрузил из ресурсов. Я установил значение foregroundColor to accentColor , которое я также установил в качестве своего пользовательского AccentColor параметра, который будет использоваться во всем приложении.

Актив:

актив

Тело contentView:

 var body: some View {
    Image("MyImageName")
        .resizable()
        .renderingMode(.template)
        .foregroundColor(.accentColor)
        .frame(width: 32, height: 32, alignment: .center)
}
  

Предварительный просмотр и симулятор показывают изображение справа foregroundColor . Но при работе на физическом устройстве foregroundColor каким-то образом остается синий accentColor цвет телефона по умолчанию.

Предварительный просмотр:

Тренажёр:

Реальное устройство:

Почему это происходит? И как мне убедиться AssentColor , что он работает на всех устройствах независимо от версии iOS, не изменяя никаких настроек на iPhone? Сведения об отладке: версия iOS для устройства — iOS 13.5.1 и Xcode 12.0.1.

Комментарии:

1. .accentColor уже определен в системе. Как и где именно вы пытались переопределить его? Наконец, почему вы просто не установили цвет переднего плана непосредственно на цвет вашего ресурса?

2. Проверьте версии Xcode и iOS, которые я указал в OP. Вы обнаружите .accentColor , что на реальном устройстве он работает не так, как ожидалось, как на симуляторе.

Ответ №1:

Color.accentColor работает нормально, даже изменение его на a View с .accentColor(newColor) работает на iOS 13.

Единственная проблема заключается в том, что iOS 13 не устанавливает Color.accentColor цвет в активах, указанных ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME .

Что сработало для меня, так это выполнить этот шаг вручную, просто установив window.tintColor этот цвет:

 if #available(iOS 14, *) {} else {
  window.tintColor = UIColor(named: "AccentColor")
}
  

Ответ №2:

Итак, при дальнейшем тестировании я обнаружил, что, хотя accentColor он доступен с iOS 13.0 , настройка accentColor доступна только с iOS 14.0 . Поэтому я создал расширение для ручного использования accentColor ресурса from iOS 13 и нормальной работы в iOS 14.0 и выше.

 extension Color {

    static var accent: Color {
        if #available(iOS 14.0, *) {
            return accentColor
        } else {
            return Color(#colorLiteral(red: 0.5, green: 0.5, blue: 0.5, alpha: 1))
        }
    }
}
  

Ответ №3:

Я хотел оставить здесь напоминание о том, что глобальный оттенок цвета приложения может быть нарушен путем доступа к свойствам приложения (включая цвет выделения, оттенки и т. Д.) Или Создания некоторых представлений до того, как приложение создаст первое пользовательское окно.

Если цвет оттенка везде нарушен (в том числе в симуляторе), убедитесь, что вы не пытаетесь создавать или получать доступ к компонентам UIKit перед первым окном, включая сторонние SDK. В моем приложении сторонний SDK для регистрации сбоев нарушал цвет акцента.