2

我有一个主视图,并且在该视图中我有一个位于 GeometryReader 中的小弹出菜单,如下所示:

        if (self.show){
                GeometryReader{_ in
                    Menu()
                }.background(Color.black.opacity(0.65))
        }

行~~~.background(Color.black.opacity(0.65))~~~ 本质上是在制作背景(即不在弹出视图中的视图的每个部分,有点暗。我想做这样的事情:

        if (self.show){
                GeometryReader{_ in
                    Menu()
                }.background(Color.black.opacity(0.65))
                    .background(.onTapGesture{
                        print("asdf")
                        })
        }

但不支持此语法。有什么办法可以做到这一点吗?本质上,我想要它,以便当我在 GeometryReader 之外单击时,我可以切换一个变量(在这种情况下,摆脱弹出视图)。

我尝试在主视图上制作一个 TapGesture 识别器,但由于 GeometryReader 是主视图的一部分,所以当我点击 GeometryReader 弹出视图本身时,它就会消失。

有什么方法可以完成类似于我上面写的代码的事情吗?

谢谢

4

1 回答 1

1

这是一个例子。我使用三个 tapGestures:

  • 在主视图中切换“菜单”
  • “菜单”上的一个(在那里做某事)
  • 和背景视图上的一个以再次关闭“菜单”,如下所示:
    struct ContentView: View {
        
        @State private var showMenu: Bool = false
        
        var body: some View {
            ZStack {
                
                // The Main View.
                Text("Tap Me!")
                    .padding()
                    .onTapGesture {
                        showMenu.toggle()
                        print("Tapped Main View")
                    }
                
                // The Menu View (shown on top of the Main View).
                if showMenu {
                    GeometryReader { _ in
                        Text("Menu")
                            .padding()
                            .onTapGesture {
                                // do something here
                                print("Tapped Menu")
                            }
                    }
                    
                    // The Background View that darkens the whole screen.
                    .background(
                        Color.gray.opacity(0.2)
                            .edgesIgnoringSafeArea(.all)
                    )
                    .onTapGesture {
                        showMenu.toggle()
                        print("Tapped Background")
                    }
                }
            }
        }
    }

点击“点击我!” (主视图)调出菜单视图。“菜单”捕捉点击以采取行动 - 在那里做任何你想做的事情。

每当用户在“菜单”之外点击时,背景上的 tapGesture 会识别点击并关闭“菜单”,包括变暗的背景——>主视图再次变亮。

于 2021-03-11T18:59:22.840 回答