目标:SwiftUI切换按钮,用于控制带有场景工具包的SwiftUI视图(UIViewRepresentable)
//显示fps和计时信息等统计信息
我所做的:这是UIView可表示的场景工具包视图
import SwiftUI
import SceneKit
struct ScenekitView : UIViewRepresentable {
let scene = SCNScene(named: "art.scnassets/ship.scn")!
func makeUIView(context: Context) -> SCNView {
// create and add a camera to the scene
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)
// place the camera
cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
// create and add a light to the scene
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = .omni
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
scene.rootNode.addChildNode(lightNode)
// create and add an ambient light to the scene
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light!.type = .ambient
ambientLightNode.light!.color = UIColor.darkGray
scene.rootNode.addChildNode(ambientLightNode)
// retrieve the ship node
let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!
// animate the 3d object
ship.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))
// retrieve the SCNView
let scnView = SCNView()
return scnView
}
func updateUIView(_ scnView: SCNView, context: Context) {
scnView.scene = scene
// allows the user to manipulate the camera
scnView.allowsCameraControl = true
// show statistics such as fps and timing information
scnView.showsStatistics = true
// configure the view
scnView.backgroundColor = UIColor.black
}
}
struct ScenekitView_Previews: PreviewProvider {
static var previews: some View {
ScenekitView()
}
}
这是控制场景工具包的菜单
import SwiftUI
struct Menu: View {
@State var showstats = false
var body: some View {
HStack {
Form {
Toggle(isOn:) {
Text("Stats")
}
}
.frame(width: 200.0)
Spacer()
}
}
}
struct Menu_Previews: PreviewProvider {
static var previews: some View {
Menu()
}
}
这是主场景,在场景工具包顶部有菜单:
import SwiftUI
struct MainView: View {
var body: some View {
ZStack {
ScenekitView()
Menu()
}
}
}
问:如何将数据从ScenekitView传递到Menu,以便切换和显示/隐藏统计数据?
我尝试了ObservableObject,但无法使它工作。也查看了其他SO线程,但没有一个对我有效。
任何帮助都是非常感谢!
为all
干杯
1条答案
按热度按时间mwkjh3gx1#
要将数据传递给**
updateNSView(_:context:)
或updateUIView(_:context:)
**示例方法,您需要创建@State
和@Binding
属性。使用以下代码来了解如何执行此操作(我为macOS编写了此代码,但您可以轻松地将其更改为iOS):
此外,您可以将
Coordinator
对象和delegate
用于此协调器,以便使用control
属性切换对象,并以60 fps更新renderer()
方法中的任何内容(例如)。在这种情况下,不需要使用
updateNSView()
或updateUIView()
方法: