我有一个视图中的视图中的视图中的视图。我试图在嵌套最深的视图中创建一个弹出视图,使其后面的整个屏幕变暗,但它只使嵌套视图的边界变暗,这是有意义的。但是,我如何覆盖这个设置?
下面是触发弹出窗口的条件子句:
if isSelect {
GeometryReader { _ in
SelectView()
.frame(maxWidth: .infinity, maxHeight: .infinity)
.padding(.horizontal, 35)
}
.background(
Color.black.opacity(0.65)
.edgesIgnoringSafeArea(.all)
.onTapGesture {
withAnimation {
self.isSelect.toggle()
}
}
)
} // end overlay
1条答案
按热度按时间z0qdvdin1#
为了确保我完全理解这一点,您实际上有一堆嵌套的视图,并且您希望使最低级别的视图的背景变暗。换句话说,触发背景变暗的视图一直位于层次结构的底部,而上面的视图应该变暗。
最简单的方法是将
isSelect
通过父视图向下传递到子视图并在那里处理它。它是通过引用传递的,所以对它的任何更改都会导致它在视图层次结构中向上传递。注意,在第一个视图中,我们创建了一个值,我们想观察它的变化,所以它被设置为一个
Binding
,当它的状态改变时,视图将被重绘;第二个视图从第一个视图中获取对value
的引用,所以它没有被重新创建,而是仅仅查看内存指针,以确定它是同一个对象。这里使用的概念称为
Passing By Reference
,而另一种类型的概念称为Passing By Value
,两者的工作方式完全不同。