我需要您的帮助来理解一个问题。我无法让视图在转换动画之前重新绘制其主体。看一下这个简单的例子:
import SwiftUI
struct ContentView: View {
@State private var condition = true
@State private var fgColor = Color.black
var body: some View {
VStack {
Group {
if condition {
Text("Hello")
.foregroundColor(fgColor)
} else {
Text("World")
}
}
.transition(.slide)
.animation(.easeOut(duration: 3))
Button("TAP") {
fgColor = .red
condition.toggle()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我对这个示例的期望是:当我点击按钮时,视图会重新创建其主体,文本“Hello”变为红色。现在,视图再次创建其主体并进行过渡。相反,似乎SwiftUI以某种方式合并了两个状态更改,只考虑第二个状态更改。结果是过渡发生了,但文本“Hello”不会改变颜色。 我该如何在SwiftUI中处理这种情况?有没有办法告诉框架分别更新这两个状态变化?谢谢。
@Asperi的编辑:
我尝试了你的代码,但它不起作用。结果仍然是相同的。这是带有你的代码的完整示例:
import SwiftUI
struct ContentView: View {
@State private var condition = true
@State private var fgColor = Color.black
var body: some View {
VStack {
VStack {
if condition {
Text("Hello")
.foregroundColor(fgColor)
.transition(.slide)
} else {
Text("World")
.transition(.slide)
}
}
.animation(.easeOut(duration: 3))
Button("TAP") {
fgColor = .red
condition.toggle()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这是在 iPhone 12 Mini iOS 14.1 上的结果:
ForegroundColorModifier
中的内容更改为content.foregroundColor(foregroundColor)
就可以了。 - superpuccio