在Swift当中,当我们的一个内容区域存在Spacer()时,我们无法点击Spacer()来实现具体的某个功能。
在上图当中,我们可以看到我们给一个VStack区域添加了onTapGesture(),通过点击该VStack区域会实现sendEmail()函数。
当我们尝试点击上图的Spacer()时,我们无法来调用sendEmail函数。
问题原因在于,我们是通过onTapGesture实现捕获点击动作并执行相关代码,但是VStack中的内容布局(包括Spacer())不会自动扩展VStack的点击区域,默认只在内容区域有效。
因此,当我们尝试点击Spacer()所在的区域时并不会触发点击事件。因为这些区域可能会被认为是非Stack内的空白区域。
解决方案为需要设置contentShape(Rectangle())扩展点击区域:
VStack{
...
}
.contentShape(Rectangle())
.onTapGesture {
sendEmail()
}
通过使用contentShape(Rectangle())创建一个矩形区域,覆盖整个VStack的布局区域,无论VStack内是否含有Spacer(),都会将VStack看作一个整体的点击区域。
因此我们就可以解决该问题。