#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 для регистрации сбоев нарушал цвет акцента.