ios - 如何创建一个接受 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 {
// ...
}
}
}
解决方案
推荐阅读
- git - 为什么 git rebase 会触发合并冲突?
- excel - 将一个单元格的值分配给另一个单元格不会在分配单元格中产生相同的值
- java - Java中的Base64 UTF-32解码无法按预期工作
- python - 将用户的输入传递给函数时遇到问题
- r - 在 barplot ggplot 上叠加线图 -
- python - 应用程序 Bot on_raw_reaction_add 在指定通道中使用有效负载发送消息
- asp.net-mvc - 编辑自定义 UserIdentity 对象(在数据库中)
- javascript - 如何在 React Native 中使用 multer 将图像正确发送到后端(nodejs)
- spring-data-jpa - Spring Data JPA 根据配置禁用@entity
- typescript - userRole 总是返回“用户”,即使是管理员