检测 GeometryReader SwiftUI 背景上的点击手势

Posted

技术标签:

【中文标题】检测 GeometryReader SwiftUI 背景上的点击手势【英文标题】:Detecting tap gesture on the background of a GeometryReader SwiftUI 【发布时间】:2020-06-26 23:04:32 【问题描述】:

我有一个主视图,并且在该视图中我有一个位于 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 弹出视图本身时,它就会消失。

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

谢谢

【问题讨论】:

【参考方案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 会识别点击并关闭“菜单”,包括变暗的背景 --> 主视图再次变亮。

【讨论】:

以上是关于检测 GeometryReader SwiftUI 背景上的点击手势的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 计算 ScrollView 中长 GeometryReader 的高度

SwiftUI - AppStorage 不适用于 GeometryReader

我们如何在 SwiftUI 中制作自定义 GeometryReader?

在 ScrollView 中使用 GeometryReader 的 SwiftUI 布局

SwiftUI - 如何从不同的视图中获取 GeometryReader 的大小/高度?

SwiftUI:如何在这种情况下将 .overlay 与 GeometryReader 一起使用?