如何创建一个接受SCNNodes的自定义ScrollView

时间:2019-06-25 12:58:42

标签: ios swift uiscrollview scenekit scnnode

我正在使用ARKit和SceneKit,我试图制造一个像Price is Right轮here这样的可滚动轮,尽管它会面向like this。当数字停止时,用户将可以触摸它并进行操作。我向sceneView添加了一个手势,以查找sceneView hitTest来检测被触摸的节点。

轮子由不同的单独节点组成。用户A选择其他用户的节点,用户B转动轮子。遵循这些原则,因此节点将始终分配有不同的值。这就是为什么我需要滚动视图。

我在youtube上观看了ray wenderlich视频,视频中如何制作自定义滚动视图,但是滚动视图是UIView的子类,并且不接受SCNNodes。

我尝试将collectionView添加到SCNMaterial中,但这与滚动视图存在相同的问题,因为自定义单元不允许我导入SceneKit来添加节点。

如何为接受SCNNode的SceneKit创建滚动视图?

针对普通UIView的自定义ScrollView(这不会反弹,只会滚动):

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 {
            // ...
        }
    }
}

0 个答案:

没有答案