0

我正在构建一个 SwiftUI macOS 应用程序。

我有一个基本的矩形形状,上面有一个拖动手势。

onEnded处理程序中,我想确定用户是否有效地点击了对象。我通过检查翻译的宽度和高度都为零来做到这一点。

(我不使用点击手势是有原因的)。

Rectangle()
    .size(.init(width:50, height: 50))
    .fill(Color.blue.opacity(0.01))
    .gesture(DragGesture(minimumDistance:0)
                .onChanged { gesture in
                    // Ommited
                }
                .onEnded { gesture in
                    print("startLocation", gesture.startLocation)
                    print("start", gesture.location)
                    print("translation", gesture.translation)
                    
                    if gesture.translation == .zero {
                        print("tap")
                    }

                    print()
                }
    )

我遇到了翻译报告的意外值的问题。

报告的值根据我在矩形中单击的位置而有所不同。

这是一组单独的点击。translation源自startLocationandlocation字段。

您可以看到startLocationlocation字段之间的变化。如果它是一个非常小的变化,我可以去抖动,但是有时我得到一个值的事实3让我想知道为什么会发生这种变化(我非常小心地执行点击而不移动)。

有谁知道为什么这种变化正在蔓延?

startLocation (263.5149841308594, 144.3092803955078)
start (263.51495361328125, 144.30926513671875)
translation (-3.0517578125e-05, -1.52587890625e-05)

startLocation (276.2882995605469, 144.43479919433594)
start (276.288330078125, 144.434814453125)
translation (3.0517578125e-05, 1.52587890625e-05)

startLocation (274.3827209472656, 162.3402557373047)
start (274.38275146484375, 162.34027099609375)
translation (3.0517578125e-05, 1.52587890625e-05)

startLocation (264.81805419921875, 167.47662353515625)
start (264.81805419921875, 167.47662353515625)
translation (0.0, 0.0)
tap

startLocation (254.5931396484375, 135.4690399169922)
start (254.5931396484375, 135.46905517578125)
translation (0.0, 1.52587890625e-05)

startLocation (259.1647033691406, 140.26919555664062)
start (259.16473388671875, 140.26919555664062)
translation (3.0517578125e-05, 0.0)

编辑

正如下面所指出的, 的值3实际上3e-05 = 0.00003是我在撰写本文时错过的。但是,仍在寻找有关为什么轻击手势在 Rectangle 的某些点上重复单击时的平移为零,而在其他点上的平移为非零的信息。

4

1 回答 1

0

这个怎么样?

if gesture.translation.width/UIScreen.main.bounds.width < 0.05 &&
gesture.translation.height/UIScreen.main.bounds.height < 0.05 
{
    print("tap") // 0.01 ~ 0.05
}

这种方式有效,无论设备的大小和宽度和高度如何,它总是保持不变,因为它以百分比表示。

于 2021-06-21T22:12:43.647 回答