我的tapAction
是foregroundColor
时,我的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)
答案 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
填充的形状不会产生可点击的区域。
有两种解决方法:
使用Color.black.opacity(0.0001)
(即使在每通道10位显示上)。这将生成一种非常透明的颜色,以至于不会对您的外观产生影响,并生成可填充其框架的可点击区域。我不知道SwiftUI是否足够聪明,可以跳过渲染颜色,所以我不知道它是否会对性能产生影响。
使用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的触摸