SwiftUI 剪切图像仍然接受点击手势

Dan*_*tin 3 image aspect-ratio clipped aspect swiftui

我在 SwiftUI 中剪辑图像时遇到问题

这是错误工作示例最少的代码:

struct TestView: View {
    var body: some View {
        Image("iPhone13Pro")
            .resizable()
            .scaledToFill()
            .frame(width: 400, height: 400)
            .border(.black)
            .clipped()
            .onTapGesture {
                print("click")
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如我所料,框架外的点击不应在控制台上打印任何内容,但它会打印

结果,图像没有被剪切,我click在控制台中看到

结果似乎渲染正确,但图像外部的触摸(红色箭头)仍然产生控制台日志

使用 .clipped()

图像不是方形的,而是水平的,所以,如果没有.clipped()它,看起来像这样:

没有 .clipped()

Dan*_*tin 16

我找到了答案

.clipped()只负责视图的视觉表示

要实际通过框架限制视图并防止其越过边界,请使用.contentShape(_:)

这为我解决了问题

  • 干得好。我实际上不知道所以将来一定会使用它 (2认同)
  • 注意:例如,应在“.clipped()”修饰符之后使用“.contentShape(Rectangle())” (2认同)