这是一个不起作用的基本示例:
很不幸,这也行不通。我对SwiftUI感到非常兴奋,但在我的看法中,保持视图标识的前提下改变视图层次结构的能力是相当重要的。促使我思考这一点的实际用例是,我有一些视图,我正在为它们创建一个扇形动画。最简单的方法是将项目放在一个
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
当然算作是对结构的更改,因此所有状态之间的连续性都会丢失,一切都只是交叉淡化。有人知道该怎么做吗?