【发布时间】:2019-10-22 12:34:55
【问题描述】:
这是一个不起作用的基本示例:
import SwiftUI
struct Test : View {
@State var swapped = false
var body: some View {
if swapped { Color.green }
Color.blue.tapAction {
withAnimation { self.swapped.toggle() }
}
if !swapped { Color.green }
}
}
SwiftUI 无法弄清楚我认为第一个 Color.green 和第二个 Color.green 是同一个视图,所以当然动画只是将其中一个淡出而另一个淡入在新的地点。我正在寻找向 SwiftUI 指示这些是相同视图并将其动画化到新位置的方法。我非常兴奋地发现了.id() 修饰符,因为我相信它会给我带来我想要的效果:
import SwiftUI
struct Test : View {
@State var swapped = false
var body: some View {
if swapped { Color.green.id("green") }
Color.blue.tapAction {
withAnimation { self.swapped.toggle() }
}
if !swapped { Color.green.id("green") }
}
}
不幸的是,这也不起作用。我对 SwiftUI 感到难以置信的兴奋,但在我看来,在保持视图标识的同时更改视图层次结构的能力非常重要。促使我考虑这一点的实际用例是,我有一些视图,我正在尝试为其创建粉丝动画。最简单的方法是让ZStack 中的项目处于一种状态,以便它们都在彼此之上,然后将它们置于VStack 中处于扇出状态,以便它们垂直散开,一切可见。从ZStack 更改为VStack 当然算作结构的更改,因此状态之间的所有连续性都丢失了,一切都只是交叉淡入淡出。有谁知道该怎么办?
【问题讨论】:
标签: animation structure identity swiftui view-hierarchy