首页 > 解决方案 > 如何创建一个接受 SCNNodes 的自定义 ScrollView

问题描述

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

轮子由不同的单个节点组成。用户 A 从其他用户中挑选节点,用户 B 旋转轮子。它沿着这些线,因此节点将始终具有分配给它们的不同值。这就是我需要滚动视图的原因。

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

我尝试向 SCNMaterial 添加一个 collectionView ,但这与滚动视图相同,因为自定义单元格不允许我导入 SceneKit 以添加节点。

如何为接受 SCNNodes 的 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 {
            // ...
        }
    }
}

标签: iosswiftuiscrollviewscenekitscnnode

解决方案


推荐阅读