清除颜色后,点击操作不起作用SwiftUI

时间:2019-06-29 18:18:15

标签: ios swift swiftui

我的tapActionforegroundColor时,我的clear无法识别拍子。当我去除颜色时,效果很好。

那是我的代码:

ZStack {
    RoundedRectangle(cornerRadius: 0)
        .foregroundColor(Color.clear)
        .frame(width: showMenu ? UIScreen.main.bounds.width : 0)
        .tapAction {
            self.showMenu.toggle()
        }

    RoundedRectangle(cornerRadius: 5).foregroundColor(Color.green)
        .shadow(radius: 5, y: 2)
        .padding(.trailing, 50)
        .frame(width: showMenu ? UIScreen.main.bounds.width : 0)
}
.edgesIgnoringSafeArea(.top)

3 个答案:

答案 0 :(得分:1)

准确的方法是在视图上使用.contentShape(Rectangle())。 在本教程中进行了描述:

control-the-tappable-area-of-a-view,作者:Paul Hudson @twostraws

VStack {
    Image("Some Image").resizable().frame(width: 50, height: 50)
    Spacer().frame(height: 50)
    Text("Some Text")
}
.contentShape(Rectangle())
.onTapGesture {
    print("Do Something")
}

how-to-control-the-tappable-area-of-a-view-using-contentshape堆栈溢出

答案 1 :(得分:0)

我还发现用Color.clear填充的形状不会产生可点击的区域。

有两种解决方法:

  1. 使用Color.black.opacity(0.0001)(即使在每通道10位显示上)。这将生成一种非常透明的颜色,以至于不会对您的外观产生影响,并生成可填充其框架的可点击区域。我不知道SwiftUI是否足够聪明,可以跳过渲染颜色,所以我不知道它是否会对性能产生影响。

  2. 使用GeometryReader获取帧大小,然后使用contentShape生成可点击区域:

    GeometryReader { proxy in
        Color.clear.contentShape(Path(CGRect(origin: .zero, size: proxy.size)))
    }
    

答案 2 :(得分:0)

这里是组件

struct InvisibleButton: View {

    let action: (() -> Void)?

    var body: some View {
        Color.clear
        .contentShape(Rectangle())
        .onTapGesture {
            action?()
        }
    }
}

用法:将视图和InbisibleButton放在ZStack中

ZStack {
     **yourView()**
     InvisibleButton {
        print("Invisible button tapped")
     }
}

您还可以创建修饰符以简化用法:

struct InvisibleButtonModifier: ViewModifier {

    let action: (() -> Void)?

    func body(content: Content) -> some View {
        ZStack {
            content
            InvisibleButton(action: action)
        }

    }
}


     **yourView()**
     .modifier(InvisibleButtonModifier {
        print("Invisible button tapped")
      })

但是,如果您的SwiftUI视图具有UIKit视图作为其子视图,则必须设置Color.gray.opacity(0.0001)才能忽略UIView的触摸