Ios 如何同时使用SwiftUI和SceneKit?

Ios 如何同时使用SwiftUI和SceneKit?,ios,rotation,swiftui,scenekit,swift5,Ios,Rotation,Swiftui,Scenekit,Swift5,我在SwiftUI的一个框架内的一个场景中显示了一个SCNCylinder。我想绕某个轴旋转180º。我希望在按下SwiftUI视图中的180º(类)按钮后,圆柱体旋转。目前,我可以旋转它一次,但第二次按下按钮时它不会旋转。我试着先将旋转角度定义为零,然后再定义为180º,但这样做之后,整个过程在我按下按钮后崩溃了。我只想在我按下按钮后第二次旋转圆柱体 这是我的密码: //SwiftUI view struct ContentView: View { @State var rotationAn

我在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)

}

}

}
//SwiftUI视图
结构ContentView:View{
@状态变量旋转角度:角度=.degrees(0)
var body:一些观点{
VStack{
文本(“180º”).ontaps手势{
自旋转角度=.0
自转角度=.度(180)
}
}
SceneKitView(半径:0.02,高度:2,角度:$rotationAngle)
.位置(x:200.0,y:140)
.框架(宽度:300,高度:300,对齐:。中心)
}
}
}
//SceneKit视图
结构SceneKitView:UIViewRepresentable{
@绑定变量角度:角度
让圆柱体节点:SCNNode
初始(半径:CGFloat,高度:CGFloat,角度:Binding){
让圆柱体=圆柱体(半径:半径,高度:高度)
圆柱体.firstMaterial?.diffuse.contents=UIColor.green
self.cylindernode=SCNNode(几何图形:圆柱体)
self.cylindernode.position=SCInvector3(0,0,0)
self.cylindernode.orientation=SCInvector4(0,0,0,0)
cylindernode.pivot=SCNMatrix4MakeTranslation(0,-1,0)
自身角度=角度
}
//SCNScene
func makeUIView(上下文:UIViewRepresentableContext)->SCNView{
让sceneView=SCNView()
sceneView.scene=SCNScene()
sceneView.autoenablesDefaultLighting=true
sceneView.allowsCameraControl=true
sceneView.scene?.rootNode.addChildNode(cylindernode)
返回场景视图
}
func UpdateUI视图(sceneView:SCNView,context:UIViewRepresentableContext){
//旋转动画
让旋转=CABASICANIATION(关键路径:“transform.rotation”)
rotation.isRemovedOnCompletion=false
轮换时间=5
addAnimation(旋转,forKey:“旋转”)
cylindernode.rotation=SCInvector4(1,0,0,角度弧度)
}
}
}

删除行
self.rotationAngle=.zero
后,代码运行良好,但视图不更新。但是如果我不挂断电话,整个事情就会在我按下按钮后崩溃

试试这个:但是因为你问了很多问题,而且这些问题都很基本,也许你应该去看看一些初学者的swift课程,学习如何设置变量……而这与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)
        }
    }
}

如果你把它设为180,那就是它旋转的方向。尝试增加你的角度(可能是一个较小的量),这样你可以看到它移动。。。或使用旋转(按:…)