How Can I Add DeviceMotion Capabilities to a Swift Playground?

自作多情 提交于 2019-12-11 15:23:19

问题


I am working on a Swift playground and I am trying to use this code to get the device motion.

@objc func update()
{
    if let deviceMotion = motionManager.deviceMotion {
        print("Device Motion Yaw: \(deviceMotion.attitude.yaw)")
    }
}

However, it seems that device motion does not work on a Swift playground even though it works in iOS. How would I change a playground to support device motion? I am using an iPad running iOS 12 and the latest version of Swift Playgrounds and a Mac for the code. I know that the method gets called perfectly, and the code runs perfectly when I put it as part of an iOS app on both an iPad and an iPhone. How would I modify a playground to support this, as from my understanding it does not by default?


回答1:


It is entirely possible. I’ve done it on several occasions. You’ll need a CMMotionManager class. There are many ways to do this, but I would recommend using a timer. Here is some example code, taken from Apple’s developer documentation and modified to fit the question.

let motion = CMMotionManager()
func startDeviceMotion() {
    if motion.isDeviceMotionAvailable {
        //How often to push updates
        self.motion.deviceMotionUpdateInterval = 1.0/60.0
        self.motion.showsDeviceMovementDisplay = true
        self.motion.startDeviceMotionUpdates(using: .xMagneticNorthZVertical)

        // Configure a timer to fetch the motion data.
        self.timer = Timer(fire: Date(), interval: (1.0 / 60.0), repeats: true,
                           block: { (timer) in
                            if let data = self.motion.deviceMotion {      
let x = data.attitude.pitch
let y = data.attitude.roll
let z = data.attitude.yaw
//Use the data                                
                            }
        })
        RunLoop.current.add(self.timer!, forMode: RunLoop.Mode.default)
    }
}
startDeviceMotionUpdates()

Either do that or try something like this, also from the documentation

func startQueuedUpdates() {
   if motion.isDeviceMotionAvailable {       self.motion.deviceMotionUpdateInterval = 1.0 / 60.0
      self.motion.showsDeviceMovementDisplay = true
      self.motion.startDeviceMotionUpdates(using: .xMagneticNorthZVertical, 
               to: self.queue, withHandler: { (data, error) in
         // Make sure the data is valid before accessing it.
         if let validData = data {
            // Get the attitude relative to the magnetic north reference frame. 
            let roll = validData.attitude.roll
            let pitch = validData.attitude.pitch
            let yaw = validData.attitude.yaw

            // Use the motion data in your app.
         }
      })
   }
}


来源:https://stackoverflow.com/questions/55294421/how-can-i-add-devicemotion-capabilities-to-a-swift-playground

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!