CoreMotion中的加速度计在Swift 3中不起作用

时间:2017-02-02 16:21:29

标签: swift swift3

我的应用使用CoreMotion让玩家在设备倾斜时移动。它在Swift 2中运行得很好但是当我将它更新到Swift 3时它已经停止工作了。我没有收到任何加速度计更新。

override func didMove(to view: SKView) {
    manager.startAccelerometerUpdates()
    manager.accelerometerUpdateInterval = 0.1
    manager.startAccelerometerUpdates(to: OperationQueue.main){ (data, Error) in
        if let accelerometerData = self.manager.accelerometerData {
            self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.y * 10, dy: accelerometerData.acceleration.x * 10)
        }
    }
}

1 个答案:

答案 0 :(得分:2)

NSError已在Swift 3中重命名为Error,因此请制作Error变量camelCase(在您的情况下为小写)。它应该是camelCase,因为它是一个变量,无论如何。

这是该函数的新版本,修复了该函数并修复了其他小错误(请注意关于交换X和Y的注释):

override func didMove(to view: SKView) {
    manager.accelerometerUpdateInterval = 0.1
    manager.startAccelerometerUpdates(to: OperationQueue.main) { data, _ in
        if let accelerometerData = data {
            // IMPORTANT: Are you intentionally swapping x and y here? -----------> ↓
            self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.y * 10,
                                                 dy: accelerometerData.acceleration.x * 10)
        }
    }
}

这是原始函数,只重命名变量(注意:这里有一些编程错误,我不建议使用它):

override func didMove(to view: SKView) {

    manager.startAccelerometerUpdates()
    manager.accelerometerUpdateInterval = 0.1
    manager.startAccelerometerUpdates(to: OperationQueue.main) { (data, error) in

        if let accelerometerData = self.manager.accelerometerData {
            self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.y * 10, dy: accelerometerData.acceleration.x * 10)
        }

    }
}

编辑:您不应将主队列用作OperationQueue来接收Accelerometer更新。请参阅Apple's documentation