如何同时使用SwiftUI和SceneKit?

问题描述 投票:0回答:1

我在SwiftUI的框架内的场景中显示了一个SCNCylinder。我想绕某个轴旋转180º。我希望在SwiftUI视图中按下180º(种类)按钮后,圆柱体旋转。目前,我只能旋转一次,但是第二次按下按钮时它不能旋转。我尝试先将旋转角度定义为零,然后再定义为180º,但是这样做之后,按下按钮后整个过程就会崩溃。我只希望气缸在按下按钮后第二次旋转。

这是我的代码:

//SwiftUI view

struct ContentView: View {
@State var rotationAngle: Angle = .degrees(0)
var body: some View {

    VStack{

        Text("180º").onTapGesture {
           self.rotationAngle = .zero
           self.rotationAngle = .degrees(180)

        }

        }
        SceneKitView(radius: 0.02, height: 2, angle: $rotationAngle)
            .position(x: 200.0, y: 140)
            .frame(width: 300, height: 300, alignment: .center)
        }

     }

  }

//SceneKit View

 struct SceneKitView: UIViewRepresentable {

  @Binding var angle: Angle

 let cylindernode: SCNNode

 init(radius: CGFloat, height: CGFloat, angle: Binding<Angle>) {

    let cylinder = SCNCylinder(radius: radius, height: height)
    cylinder.firstMaterial?.diffuse.contents = UIColor.green
    self.cylindernode = SCNNode(geometry: cylinder)
    self.cylindernode.position = SCNVector3(0, 0, 0)
    self.cylindernode.orientation = SCNVector4(0, 0, 0, 0)
    cylindernode.pivot = SCNMatrix4MakeTranslation(0, -1, 0)

    self._angle = angle

}

//SCNScene

func makeUIView(context: UIViewRepresentableContext<SceneKitView>) -> SCNView {

    let sceneView = SCNView()
    sceneView.scene = SCNScene()
    sceneView.autoenablesDefaultLighting = true
    sceneView.allowsCameraControl = true
    sceneView.scene?.rootNode.addChildNode(cylindernode)
    return sceneView
}

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

 //Rotation animation

    let rotation = CABasicAnimation(keyPath: "transform.rotation")
    rotation.isRemovedOnCompletion = false
    rotation.duration = 5
    cylindernode.addAnimation(rotation, forKey: "rotation")
    cylindernode.rotation = SCNVector4(1, 0, 0, angle.radians)

}

}

}

删除行self.rotationAngle = .zero后,代码运行良好,但视图未更新。但是如果我坚持下去,按下按钮后整个事情就会崩溃。

ios rotation swiftui scenekit swift5
1个回答
0
投票

尝试:但是由于您提出了很多问题,而且它们是如此基础,所以也许您应该检查一些初学者的快速课程以学习如何设置变量...而这与Scenekit和SwiftUI没有关系-它只是在更改变量。

struct ContentView: View {
    @State var rotationAngle: Angle = .degrees(0)
    var body: some View {

        VStack{

            Text("180º").onTapGesture {
                self.rotationAngle += .degrees(90)
                print(self.rotationAngle)
            }
            SceneKitView(radius: 0.02, height: 2, angle: $rotationAngle)
                .position(x: 200.0, y: 140)
                .frame(width: 300, height: 300, alignment: .center)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.