【问题标题】:Accelerometer in CoreMotion Not Working In Swift 3CoreMotion 中的加速度计在 Swift 3 中不起作用
【发布时间】:2017-02-04 21:06:45
【问题描述】:

我的应用程序使用 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)
        }
    }
}

【问题讨论】:

  • 您说:“它已停止工作”。我只能猜测你的意思是它编译和运行良好,但你的处理程序永远不会被调用。对吗?

标签: swift swift3


【解决方案1】:

NSError 在 Swift 3 中已重命名为 Error,因此请让您的 Error 变量为驼峰式(在您的情况下为小写)。无论如何,它应该是 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 来接收加速度计更新。见Apple's documentation

【讨论】:

  • 我已经尝试使用您的解决方案,但它仍然没有调用加速度计,我确实在日志中收到一条消息“如果我们在真正的预提交处理程序中,我们实际上无法添加由于 CA 限制而产生的任何新围栏”。我不确定这是否是问题所在。
  • 你确定没有调用处理程序吗?尝试将:print("Got accelerometer data: \(accelerometerData)") 放在 if let accelerometerData... 行之后。另外,您使用的是哪个版本的代码?
  • 我确定没有调用处理程序,日志只显示[App] if we're in the real pre-commit handler we can't actually add any new fences due to CA restriction我使用您上面建议的代码
  • 我确定调用了处理程序,因为that log message can be safely ignored。请在发布之前研究您遇到的任何错误。无论如何,在didMove 函数正下方添加一个print 语句,以确保处理程序甚至已注册。另请参阅我的编辑。
  • 谢谢。我看到它没有被调用,我能够将问题跟踪到视图控制器没有加载 .swift 文件
猜你喜欢
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2015-05-09
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
相关资源
最近更新 更多