我正在使用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 {
// ...
}
}
}