完全有可能在视图外部定义@namespace var并将其传递给视图。例如,在
State
类中这样做?
I包括了一个匹配动画的基线代码。我尝试了几件事(例如this),没有成功,这意味着动画不匹配。我已经看到了一些解决方案,但是@namespace var始终是我无法做的视图属性。
import SwiftUI
import PlaygroundSupport
enum Flow {
case initial
case searching
}
class State: ObservableObject {
@Published var flow: Flow = .initial
}
let state = State()
struct Container: View {
@Namespace var namespace
@ObservedObject var state: State
var body: some View {
VStack {
SubView1(state: state, namespace: namespace)
SubView2(state: state, namespace: namespace)
}
.onTapGesture {
withAnimation(.spring()) {
if state.flow == .initial {
state.flow = .searching
} else {
state.flow = .initial
}
}
}
.frame(width: 300, height: 300)
}
}
struct SubView1: View {
@ObservedObject var state: State
var namespace: Namespace.ID
var body: some View {
HStack {
Text("Lorem")
Spacer()
if state.flow == .initial {
Text("Ipsum")
.matchedGeometryEffect(id: "id", in: namespace)
Text("|")
}
Image(systemName: "person.circle.fill")
}
}
}
struct SubView2: View {
@ObservedObject var state: State
var namespace: Namespace.ID
var body: some View {
VStack {
Text("Headline")
if state.flow == .searching {
Text("Ipsum")
.matchedGeometryEffect(id: "id", in: namespace)
}
}
}
}
PlaygroundPage.current.setLiveView(Container(state: state))
Namespace
是一个
DynamicProperty
,并且仅在aDynamicProperty
中起作用,因为它们在更新时获得了价值。