为什么我们总是在命中测试中使用集合的第一个元素,而不是最后一个?

时间:2019-07-08 11:50:54

标签: ios swift scenekit arkit

为什么我们必须使用hitTestResult.first,尽管我们可以在屏幕上轻击几次,然后每次点击都以hitTestResult.last的形式写入数组?

@objc func tapped(gesture: UITapGestureRecognizer) {

    let touchPosition: CGPoint = gesture.location(in: sceneView)
    let hitTestResult: [ARHitTestResult] = sceneView.hitTest(touchPosition, types: .existingPlaneUsingExtent)

        if !hitTestResult.isEmpty {

            guard let hitResult = hitTestResult.first else {
                return
            }
            addGrass(hitTestResult: hitResult)
        }
    }
}

1 个答案:

答案 0 :(得分:1)

轻击几次根本不会影响hitTest的结果。如果用户在同一位置用1个对象轻击100次,您仍然只能通过hitTest方法获得1个对象。

根据发现的文档here,将要返回的对象是“从最近到最远(与相机的距离)排序的”。

因此,为了更基本地理解事物,您可能在任何给定时间在屏幕上拥有任意数量的对象。并且在任何时候您都可以使用hitTest,通过给定touchPosition,您可以在定义的视图部分中看到当时所有可见的对象。由于在同一视图位置中可能有多个项目,因此这些项目将在数组中进行检索,并对其进行排序,从而使看起来更靠近您的项目位于数组的开头。

因此,将first更改为last仅意味着宁愿使用背面的对象,也不使用正面的对象。