CoreMotion не работает в Swift Playgrounds - PullRequest
0 голосов
/ 20 марта 2019
import UIKit
import ARKit
import PlaygroundSupport
import SceneKit
import CoreMotion

class MyViewController: UIViewController {

let motionManager = CMMotionManager()
var timer: Timer!
var label = UILabel(frame: CGRect(x: 50, y: 400, width: 400, height: 100))

override func loadView() {

    let view = UIView()

    view.addSubview(label)
    label.text = "Show Yaw Here"
    self.view = view
    view.backgroundColor = .white

    motionManager.startAccelerometerUpdates()
    motionManager.startGyroUpdates()
    motionManager.startMagnetometerUpdates()
    motionManager.startDeviceMotionUpdates()

    timer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(MyViewController.update), userInfo: nil, repeats: true)
}

@objc func update() {
    self.label.text = "Obama"
    if let accelerometerData = motionManager.accelerometerData {
        print("Device Accelerometer: \(accelerometerData)")
    }
    if let gyroData = motionManager.gyroData {
        print("Device Gyro: \(gyroData)")
    }
    if let magnetometerData = motionManager.magnetometerData {
        print("Device Magnetometer: \(magnetometerData)")
    }
    if let deviceMotion = motionManager.deviceMotion {
        print("Device Motion: \(deviceMotion)")
        let yaw = (Int)(Double(floor(1000*deviceMotion.attitude.yaw)/1000) * 180.0/Double.pi)
        self.label.text = "Yaw: \(yaw) Degrees"
    }
}
}
PlaygroundPage.current.liveView = MyViewController()

Это (выше) код, который я использую в качестве игровой площадки.Я получил код непосредственно из приложения iOS, и он отлично работает, когда я запускаю приложение iOS на том же устройстве, которое представляет собой iPad с раннего 2018 года, работающий под iOS 12. Это код, который я использовал для реального приложения, которое отлично работает наIPAD.Все, что он делает, это записывает значение Yaw в градусах в текстовое поле.Я не получаю ошибок или предупреждений, когда запускаю одну из них.Контроллер вида действительно появляется на детской площадке, так же, как и исходный текст метки, но код не обновляет движение устройства при перемещении iPad, в то время как он обновляется в версии приложения.

import UIKit
import CoreMotion

class ViewController: UIViewController {

let motionManager = CMMotionManager()
var timer: Timer!
@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    label.text = "ayy lmao"

    motionManager.startAccelerometerUpdates()
    motionManager.startGyroUpdates()
    motionManager.startMagnetometerUpdates()
    motionManager.startDeviceMotionUpdates()

    timer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(ViewController.update), userInfo: nil, repeats: true)
}

@objc func update() {
    if let accelerometerData = motionManager.accelerometerData {
        print("Device Accelerometer: \(accelerometerData)")
    }
    if let gyroData = motionManager.gyroData {
        print("Device Gyro: \(gyroData)")
    }
    if let magnetometerData = motionManager.magnetometerData {
        print("Device Magnetometer: \(magnetometerData)")
    }
    if let deviceMotion = motionManager.deviceMotion {
        print("Device Motion: \(deviceMotion)")
        let yaw = (Int)(deviceMotion.attitude.yaw * 180.0/Double.pi)
        self.label.text = "Yaw: \(yaw) Degrees"
    }
}
}

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Core Motion Framework отлично работает в приложении Swift Playgrounds на iPad для всех устройств, ДРУГИХ, чем Device Motion. StartDeviceMotionUpdates(to:){} не может доставить обновления. К сожалению, я не нашел объяснения, почему это должно быть! Доступ к GPS, разумеется, возможен только через CoreLocation, для чего требуется проверка безопасности, недоступная в приложении, поэтому также нет возможности получить доступ к данным GPS.

0 голосов
/ 20 марта 2019

Базовые API определения местоположения являются асинхронными, поэтому вы должны поддерживать игровую площадку в рабочем состоянии после вызова startUpdatingLocation ().Так что дайте этому вращение

PlaygroundPage.current.needsIndefiniteExecution = true 

Подробнее о needsindefiniteExecution

...