SwiftUI: цвет анимации текста - foregroundColor()

Я пытался поработать над анимацией различных 9X_ios-sdk частей пользовательского интерфейса, но 9X_apple-ios мне кажется, что вы не можете анимировать 9X_iphone-os foregroundColor текста SwiftUI? Я хочу плавно 9X_swiftui-bug переключать цвет текста при изменении состояния. Это 9X_swiftui отлично работает, если я анимирую цвет фона 9X_ios-sdk окружающего текста текста, но цвет переднего 9X_iphone-os плана не работает. Кому-нибудь повезло с 9X_swift1.2 анимацией такого изменения? Не уверен, что 9X_swift это ошибка бета-версии Xcode или ее предполагаемая 9X_swiftui функциональность ...

Text(highlightedText) .foregroundColor(color.wrappedValue) .animation(.easeInOut) // Error: Cannot convert value of type 'Text' to closure result type '_' 

21
1

  • Я нашел этот ответ на Reddit, который решил его для меня: https://www.reddit.com/r/SwiftUI/comments/hxbdns/why_foregroundcolorflag_green_red_do_not_animate/ В о ...
3
Общее количество ответов: 3

Ответ #1

Ответ на вопрос: SwiftUI: цвет анимации текста - foregroundColor()

Есть гораздо более простой способ, заимствованный 9X_ios из кода учебника Apple «Анимация видов и 9X_swift-language переходов». Создание экземпляра GraphCapsule 9X_swift-language в HikeGraph демонстрирует это.

Хотя foregroundColor нельзя 9X_swift анимировать, colorMultiply можно. Установите белый цвет 9X_swift-language переднего плана и используйте colorMultiply, чтобы 9X_swiftui-bug установить фактический цвет, который вы 9X_iphone-os хотите. Чтобы анимировать от красного к 9X_swiftui синему:

struct AnimateDemo: View { @State private var color = Color.red var body: some View { Text("Animate Me!") .foregroundColor(Color.white) .colorMultiply(self.color) .onTapGesture { withAnimation(.easeInOut(duration: 1)) { self.color = Color.blue } } } } struct AnimateDemo_Previews: PreviewProvider { static var previews: some View { AnimateDemo() } } 

53
0

Ответ #2

Ответ на вопрос: SwiftUI: цвет анимации текста - foregroundColor()

9X_SwiftUI: цвет анимации текста - foregroundColor()_iphone-os

Свойство Color Text нельзя анимировать в SwiftUI или 9X_ios UIKit. НО ВЫ МОЖЕТЕ добиться желаемого результата вот так:

struct ContentView: View { @State var highlighted = false var body: some View { VStack { ZStack { // Highlighted State Text("Text To Change Color") .foregroundColor(.red) .opacity(highlighted ? 1 : 0) // Normal State Text("Text To Change Color") .foregroundColor(.blue) .opacity(highlighted ? 0 : 1) } Button("Change") { withAnimation(.easeIn) { self.highlighted.toggle() } } } } } 

Вы 9X_swift можете инкапсулировать эту функциональность 9X_swiftui в пользовательский View и использовать его где 9X_swift угодно.

7
0

Ответ #3

Ответ на вопрос: SwiftUI: цвет анимации текста - foregroundColor()

В SwiftUI есть отличный протокол, который 9X_swift-ios позволяет анимировать что угодно. Даже вещи, которые 9X_iphone-os нельзя анимировать! (например, цвет текста). Протокол 9X_swift-ios называется AnimatableModifier.

Если вы хотите 9X_swift узнать об этом больше, я написал полную 9X_ios статью, объясняющую, как это работает: https://swiftui-lab.com/swiftui-animations-part3/

Вот 9X_apple-ios пример того, как вы можете достичь такого 9X_iphone-os представления:

AnimatableColorText(from: UIColor.systemRed, to: UIColor.systemGreen, pct: flag ? 1 : 0) { Text("Hello World").font(.largeTitle) }.onTapGesture { withAnimation(.easeInOut(duration: 2.0)) { self.flag.toggle() } } 

И реализация:

struct AnimatableColorText: View { let from: UIColor let to: UIColor let pct: CGFloat let text: () -> Text var body: some View { let textView = text() // This should be enough, but there is a bug, so we implement a workaround // AnimatableColorTextModifier(from: from, to: to, pct: pct, text: textView) // This is the workaround return textView.foregroundColor(Color.clear) .overlay(Color.clear.modifier(AnimatableColorTextModifier(from: from, to: to, pct: pct, text: textView))) } struct AnimatableColorTextModifier: AnimatableModifier { let from: UIColor let to: UIColor var pct: CGFloat let text: Text var animatableData: CGFloat { get { pct } set { pct = newValue } } func body(content: Content) -> some View { return text.foregroundColor(colorMixer(c1: from, c2: to, pct: pct)) } // This is a very basic implementation of a color interpolation // between two values. func colorMixer(c1: UIColor, c2: UIColor, pct: CGFloat) -> Color { guard let cc1 = c1.cgColor.components else { return Color(c1) } guard let cc2 = c2.cgColor.components else { return Color(c1) } let r = (cc1[0] + (cc2[0] - cc1[0]) * pct) let g = (cc1[1] + (cc2[1] - cc1[1]) * pct) let b = (cc1[2] + (cc2[2] - cc1[2]) * pct) return Color(red: Double(r), green: Double(g), blue: Double(b)) } } } 

6
0