Как создать пользовательский ScrollView, который принимает SCNNodes - PullRequest
0 голосов
/ 25 июня 2019

Я использую ARKit и SceneKit, я пытаюсь создать колесо с прокруткой, например, Колесо цены является правильным здесь , хотя оно будет обращено вперед , например . Когда номер останавливается, пользователь сможет прикоснуться к нему, и произойдет действие. Я добавил жест в sceneView, чтобы найти hitTest sceneView, чтобы обнаружить узел, который был затронут.

Колесо состоит из разных отдельных узлов. Пользователь A выбирает узлы у других пользователей, а пользователь B вращает колесо. Именно по этим направлениям узлам всегда будут назначаться разные значения. Вот почему мне нужен вид прокрутки.

Я смотрел видео Ray wenderlich на youtube о том, как сделать пользовательский вид прокрутки, но вид прокрутки является подклассом UIView, и он не принимает узлы SCNNode.

Я попытался добавить collectionView в SCNMaterial, но это та же проблема, что и в представлении прокрутки, потому что пользовательские ячейки не позволяют мне импортировать SceneKit для добавления узлов.

Как мне создать представление прокрутки для SceneKit, которое принимает SCNNode?

Пользовательский ScrollView для обычных UIView (это не отказов, это просто прокрутка):

import UIKit
import SceneKit

class CustomScrollView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)

        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panView(with:)))
        addGestureRecognizer(panGesture)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    @objc fileprivate func panView(with gestureRecognizer: UIPanGestureRecognizer) {

        let translation: CGPoint = gestureRecognizer.translation(in: self)
        UIView.animate(withDuration: 0.20) {
            self.bounds.origin.y = self.bounds.origin.y - translation.y
        }
        gestureRecognizer.setTranslation(.zero, in: self)
    }
}

Жест касания SceneView:

@objc func nodeWasTapped(_ recognizer: UITapGestureRecognizer) {

    guard let sceneView = recognizer.view as? ARSCNView else { return }

    let touchLocation: CGPoint = recognizer.location(in: sceneView)

    let hitResults = sceneView.hitTest(touchLocation, options: [:])
    if !hitResults.isEmpty {

        guard let hitResult = hitResults.first else { return }

        if let node = hitResult.node as? SCNNode {
            // ...
        }
    }
}
...