SwiftUI - 为啥 contentShape 会阻止单击叠加层?

Posted

技术标签:

【中文标题】SwiftUI - 为啥 contentShape 会阻止单击叠加层?【英文标题】:SwiftUI - why does contentShape block clicking on an overlay?SwiftUI - 为什么 contentShape 会阻止单击叠加层? 【发布时间】:2021-04-19 03:27:04 【问题描述】:

这是来自真实应用的一些精简代码。我尝试使用偏移叠加来创建一个位于列表中项目旁边的小弹出窗口。我发现contentShape() 会干扰覆盖层上的tapGesture。如果我在以下示例中取消注释 .contentShape(Rectangle()) 行,您将无法再单击蓝色叠加层。

有人知道为什么吗?也许这是一个错误。我在 macOS 11.2.3 上运行它。

struct ContentView: View 
    var body: some View 
        VStack(alignment: .leading, spacing: 0) 
            OverlayTapTest()
                // .contentShape(Rectangle())
                .zIndex(1)
            Text("Line 2")
            Text("Line 3")
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    



struct OverlayTapTest: View 
    var body: some View 
        Text("OverlayTapTest - Test")
            .contentShape(Rectangle())
            .onTapGesture  print("Tapped Text") 
            .overlay(
                Text("OverlayTapTest - Overlay")
                    .contentShape(Rectangle())
                    .onTapGesture  print("Tapped Overlay") 
                    .background(Color.blue)
                    .offset(x: 20, y: 18),
                alignment:.topLeading
            )
    


【问题讨论】:

【参考方案1】:

你使用onTapGesture的顺序错误,看看工作方式:


struct ContentView: View 
    var body: some View 
        VStack(alignment: .leading, spacing: 0) 
            OverlayTapTest()
                 .contentShape(Rectangle())
                .zIndex(1)
            Text("Line 2")
            Text("Line 3")
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    



struct OverlayTapTest: View 
    
    var body: some View 
        
        Text("OverlayTapTest - Test")
            .contentShape(Rectangle())
            .overlay(Text("OverlayTapTest - Overlay")
                    .contentShape(Rectangle())
                    .onTapGesture  print("Tapped Overlay") 
                    .background(Color.blue)
                    .offset(x: 20, y: 18),
                alignment:.topLeading)
            .onTapGesture  print("Tapped Text")    // <<: Here
            
    

【讨论】:

您的代码对我不起作用。我点击蓝色矩形,什么也没得到。然后如果我取消注释contentShape()ContentView.body 中的那个),我可以点击蓝色。这与我的示例行为相同。 我的答案对我有用,我使用的是 Xcode:版本 12.4 (12D4e)、macOS 11.2.3 (20D91) 当您点击蓝色框时,您是否在控制台中看到“Tapped Overlay”打印? 是的,我的回答是,不是你的代码。 哇,这很奇怪。我们有相同版本的 macOS 和 Xcode,我得到不同的行为。我可以尝试重新启动系统,但是??。

以上是关于SwiftUI - 为啥 contentShape 会阻止单击叠加层?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中图像按钮的可点击区域

SwiftUI 中的上下文菜单预览没有圆角

为啥 SwiftUI 教程中没有显示 Image 对象?

SwiftUI:为啥 ObservedObject 在 AppDelegate 中不起作用?

为啥自定义 SwiftUI 视图不响应状态变化

SwiftUI,为啥部分视图没有刷新? @State 变量未更新