如何在不同的视图中使用SwiftUI?

时间:2019-12-11 01:33:53

标签: scenekit swiftui swift5

我在SCNCylinder中有SCNScene,在它下面的SwiftUI框架中有一个按钮。每当按下按钮时,圆柱体就会旋转90°。我的代码无法获得预期的结果。

//SwiftUI 

struct ContentView: View {

  var body: some View {

    VStack{ 

        Button(action: {
            // What to perform

             let rotationangle = 180.0
        }) {
            // How the button looks like

            Text("90°")
                .frame(width: 100, height: 100)
                .position(x: 225, y: 500)

            }

            SceneKitView()
                .frame(width: 300, height: 300)
                .position(x: 0, y: 200)


      }
   }
}

//SceneKit 

struct SceneKitView: UIViewRepresentable {
    func makeUIView(context:     
    UIViewRepresentableContext<SceneKitView>) -> SCNView {
     //Scene properties 

       let sceneView = SCNView()
       sceneView.scene = SCNScene()
       sceneView.allowsCameraControl = true
       sceneView.autoenablesDefaultLighting = true
       sceneView.backgroundColor = UIColor.white
       sceneView.frame = CGRect(x: 0, y: 10, width: 0, height: 1)

    //Cylinder properties 

    let cylinder  = SCNCylinder(radius: 0.02, height: 2.0)
    let cylindernode  = SCNNode(geometry: cylinder)
    cylindernode.position = SCNVector3(x: 0, y: 0, z: 0)
    cylinder.firstMaterial?.diffuse.contents = UIColor.green

    //Pivot and rotation of the cylinder    

    func degreesToRadians(_ degrees: Float) -> CGFloat {
        return CGFloat(degrees * .pi / 180)
    }

    cylindernode.pivot = SCNMatrix4MakeTranslation(0, -1, 0)

    //Line with an error: Use of unresolved identifier ‘rotationangle’
    let rotation = SCNAction.rotate(by: degreesToRadians(rotationangle), around: SCNVector3 (1, 0, 0), duration: 5)


    sceneView.scene?.rootNode.addChildNode(cylindernode)


    cylindernode.runAction(rotation)


    return sceneView
}

func updateUIView(_ uiView: SCNView, context: UIViewRepresentableContext<SceneKitView>) {

}

typealias UIViewType = SCNView
}

在SCNAction中使用“ rotationangle”时出现错误消息“使用未解析的标识符rotationangle”。

1 个答案:

答案 0 :(得分:1)

您需要在@State中声明ContentView,并在Button操作中设置属性的值。

然后,您需要在angle中将一个SceneKitView属性声明为@Binding,并使用该值使其正常工作。

我尚未对此进行测试。请记住,您没有在任何地方声明cone,所以我不确定那是什么。

import SwiftUI
import SceneKit

struct ContentView: View {
    @State var rotationAngle: Float = 0.0

    var body: some View {
        VStack {
            Button(action: {
                // What to perform
                self.rotationAngle = 180.0
            }) {
                // How the button looks like
                Text("90°")
                    .frame(width: 100, height: 100)
                    .position(x: 225, y: 500)
            }

            SceneKitView(angle: self.$rotationAngle)
                .frame(width: 300, height: 300)
                .position(x: 0, y: 200)
        }
    }
}

//SceneKit

struct SceneKitView: UIViewRepresentable {
    @Binding var angle: Float

    func degreesToRadians(_ degrees: Float) -> CGFloat {
        print(degrees)
        return CGFloat(degrees * .pi / 180)
    }

    func makeUIView(context: UIViewRepresentableContext<SceneKitView>) -> SCNView {
        // Scene properties
        let sceneView = SCNView()

        sceneView.scene = SCNScene()
        sceneView.allowsCameraControl = true
        sceneView.autoenablesDefaultLighting = true
        sceneView.backgroundColor = UIColor.white
        sceneView.frame = CGRect(x: 0, y: 10, width: 0, height: 1)

        return sceneView
    }

    func updateUIView (_ sceneView: SCNView, context: UIViewRepresentableContext<SceneKitView>) {
        if self.angle > 0 {
            // Cylinder properties
            let cylinder  = SCNCylinder(radius: 0.02, height: 2.0)
            let cylindernode = SCNNode(geometry: cylinder)
            cylindernode.position = SCNVector3(x: 0, y: 0, z: 0)
            // cone.firstMaterial?.diffuse.contents = UIColor.green

            // Pivot and rotation of the cylinder

            cylindernode.pivot = SCNMatrix4MakeTranslation(0, -1, 0)
            sceneView.scene?.rootNode.addChildNode(cylindernode)

            //Line with an error: Use of unresolved identifier ‘rotationangle’
            let rotation = SCNAction.rotate(by: self.degreesToRadians(self.angle), around: SCNVector3 (1, 0, 0), duration: 5)

            cylindernode.runAction(rotation)
        }
    }
}