我的应用使用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)
}
}
}
答案 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。