我最近开始使用SwiftUI,发现Button
的点击区域总是超出了本身的范围,这导致了我的一些UI问题。以下是我在Playground中的示例代码(使用Xcode 13.3)。同样的情况也可以在iOS设备上观察到:
struct TestView: View {
var body: some View {
VStack {
Button("Tap me") {
print("tap")
}
.background(Color.yellow)
}
.frame(width: 300, height: 500)
}
}
PlaygroundPage.current.liveView = UIHostingController(rootView: TestView())
这展示了按钮周围的点击区域有多大:
首先,我在文档中找不到任何关于此的信息。如果我漏掉了什么,请问是否可以指向一个页面/WWDC视频或者评论中解释或提到这种行为?
其次,根据此处和其他论坛中的多个讨论,您应该使用 contentShape()
修改器来更改此行为。因此,我将上述代码修改如下:
Button("Tap me") {
print("tap")
}
.background(Color.yellow)
.contentShape(Rectangle())
这将产生以下结果:
虽然有所不同,但它微不足道,不符合我的需求。我需要的是触摸区域仅延伸到按钮的可见边界。我尝试使用 scale()
和 inset()
修改形状,两者都有点效果。似乎 contentShape()
修饰符会将触摸区域扩展到提供的形状之外。可以通过提供自定义形状进行测试。形状在 path(in:)
函数中接收按钮的可见大小作为矩形。从那里返回的任何路径,contentShape()
都会添加自己的魔法数字。我能想到的唯一解决方案是创建自己的形状来抵消那些魔法数字。还有其他解决方案吗?一些更有经验的 SwiftUI 用户可以分享一下他们的想法吗?
contentShape()
与onTapGesture()
结合使用。实际上,添加一个轻拍手势识别器似乎会在按钮周围添加另一个可点击区域,其大小与没有contentShape()
修改器的普通Button
相同。 - tompitt