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 '_'
- Я нашел этот ответ на Reddit, который решил его для меня: https://www.reddit.com/r/SwiftUI/comments/hxbdns/why_foregroundcolorflag_green_red_do_not_animate/ В о ...
Ответ #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()
}
}
Ответ #2
Ответ на вопрос: SwiftUI: цвет анимации текста - foregroundColor()
Свойство 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 угодно.
Ответ #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))
}
}
}
-
13
-
16
-
12
-
8
-
2
-
5
-
2
-
3
-
15
-
7
-
15
-
4
-
27
-
24
-
4
-
27
-
7
-
3
-
9
-
8
-
6
-
6
-
2
-
6
-
3
-
1
-
5
-
7
-
2
-
1
-
14
-
2
-
4
-
4
-
4
-
9
-
6
-
3
-
5
-
1
-
4
-
1
-
7
-
3
-
6
-
2
-
2
-
3
-
3
-
4