SWIFTUI 和 Core Motion

Ste*_*noy 6 core-motion swiftui

我正在尝试在 SWIFTUI 视图中显示加速度计数据。此代码可以打印到控制台,但我不明白如何将其放入视图中,以便我可以在 SWIFTUI 中使用它。

import SwiftUI
import CoreMotion


struct AccelerometerView: View {

    let motionManager = CMMotionManager()
    let queue = OperationQueue()


    var body: some View {

        VStack{
            Text("accelerate:").onAppear {
                print("ON APPEAR")
                self.motionManager.startDeviceMotionUpdates(to: self.queue) { (data: CMDeviceMotion?, error: Error?) in
                    guard let data = data else {
                        print("Error: \(error!)")
                        return
                    }
                    let attitude: CMAttitude = data.attitude

                    print("pitch: \(attitude.pitch)")
                    print("yaw: \(attitude.yaw)")
                    print("roll: \(attitude.roll)")
                }
            }//.onappear

            //Text("Pitch:\(attitude.pitch)")

        }//Vstack

    }//view
}//struct

struct AccelerometerView_Previews: PreviewProvider {
    static var previews: some View {
        AccelerometerView()
    }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 5

这是可能的解决方案

struct AccelerometerView: View {

    let motionManager = CMMotionManager()
    let queue = OperationQueue()

    @State private var pitch = Double.zero
    @State private var yaw = Double.zero
    @State private var roll = Double.zero

    var body: some View {

        VStack{
            Text("Pitch: \(pitch)")
            Text("Yaw: \(yaw)")
            Text("Roll: \(roll)")
        }//Vstack
        .onAppear {
                print("ON APPEAR")
                self.motionManager.startDeviceMotionUpdates(to: self.queue) { (data: CMDeviceMotion?, error: Error?) in
                    guard let data = data else {
                        print("Error: \(error!)")
                        return
                    }
                    let attitude: CMAttitude = data.attitude

                    print("pitch: \(attitude.pitch)")
                    print("yaw: \(attitude.yaw)")
                    print("roll: \(attitude.roll)")

                    DispatchQueue.main.async {
                        self.pitch = attitude.pitch
                        self.yaw = attitude.yaw
                        self.roll = attitude.roll
                    }
                }
            }//.onappear
    }//view
}//struct
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是有缺陷的 - 因为“AccelerometerView”不断地重新初始化,“CMMotionManager”对象不断地重新创建。最好将其转换为`@State var`以避免重新创建。onAppear 也可能导致重复调用。 (4认同)