我正在玩新的Xcode 12 beta和SwiftUi 2.0。 .matchedGeometryEffect()
修饰符非常适合进行英雄动画。 SwiftUI中引入了一个新属性@Namespace
,非常酷炫,工作得非常好。
我只是想知道是否有可能将Namespace变量传递给多个视图?
这里是我正在处理的一个示例,
struct HomeView: View {
@Namespace var namespace
@State var isDisplay = true
var body: some View {
ZStack {
if isDisplay {
VStack {
Image("share sheet")
.resizable()
.frame(width: 150, height: 100)
.matchedGeometryEffect(id: "img", in: namespace)
Spacer()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.blue)
.onTapGesture {
withAnimation {
self.isDisplay.toggle()
}
}
} else {
VStack {
Spacer()
Image("share sheet")
.resizable()
.frame(width: 300, height: 200)
.matchedGeometryEffect(id: "img", in: namespace)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.red)
.onTapGesture {
withAnimation {
self.isDisplay.toggle()
}
}
}
}
}
}
它工作得很好。
但是如果我想将Vstack
作为子视图提取出来,下面的图片显示我已经将第一个VStack提取为子视图。
我收到了一个赞美Cannot find 'namespace' in scope
是否有一种方法可以在多个视图之间传递命名空间?
@Namespace
属性包装器创建一个命名空间。在视图范围之外初始化命名空间,将无法在转换期间绑定正确的视图和属性,因此它不起作用。相反,应该在视图的初始化时分配它,就像正确的答案建议的那样。 - Jan CássiodefaultValue
产生运行时错误。 - mickben.namespace
。另外,可以使用@EnvironmentObject
,但如果您没有先设置它,那么它将遇到相同的问题,并且会导致致命错误。 - Rad'Val