Почему мы всегда должны использовать первый элемент коллекции при тестировании на попадание, а не последний? - PullRequest
0 голосов
/ 08 июля 2019

Почему мы должны использовать 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 Ответ

1 голос
/ 08 июля 2019

Нажатие несколько раз не влияет на результат hitTest. Если пользователь нажмет 100 раз на одном и том же месте с 1 объектом, вы все равно получите только 1 объект из метода hitTest.

Начиная с найденной документации здесь объекты, которые будут возвращены, "отсортированы от ближайшего к дальнему (на расстоянии от камеры)".

Так что, чтобы попытаться понять вещи немного более в принципе, вы можете в любой момент времени иметь на экране любое количество объектов. И в любое время вы можете использовать hitTest, который даст вам все объекты, которые в данный момент видны на той части вида, которую вы определяете, задав touchPosition. Поскольку в одном и том же месте просмотра может быть несколько элементов, эти элементы извлекаются в массиве, который сортируется таким образом, что элементы, которые отображаются ближе к вам, находятся в начале массива.

Таким образом, изменение first на last будет означать только использование объекта сзади, а не объекта впереди.

...