尝试根据设备的角度旋转图像

时间:2017-03-11 17:32:14

标签: ios iphone swift core-motion

我正在尝试根据设备所处的角度旋转图像,但是当我实现我的代码时,图像没有任何反应。这是我的代码:

import UIKit

导入CoreMotion

 class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    let manager = CMMotionManager()
    let queue = OperationQueue()

    override func viewDidLoad() {
        super.viewDidLoad()
        manager.deviceMotionUpdateInterval = 0.01

        if manager.isDeviceMotionAvailable {

            manager.startDeviceMotionUpdates(to: queue) {
                [weak self] (data: CMDeviceMotion?, error: Error?) in
                    if let gravity = data?.gravity {
                        let rotation = atan2(gravity.x, gravity.y) - M_PI
                        self?.imageView.transform = CGAffineTransform(rotationAngle: CGFloat(rotation))

                    }
            }
        }
        manager.startDeviceMotionUpdates()
    }
}

问题是if let data = manager.deviceMotion永远不会运行。我没有得到任何错误,我想知道问题是什么。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

引用动画管理员的文档:

  

设备动作。调用startDeviceMotionUpdates(using:)startDeviceMotionUpdates()方法以定期开始更新   通过读取deviceMotion属性来访问CMDeviceMotion对象。   startDeviceMotionUpdates(using:)方法(iOS 5.0中的新增功能)可以让您使用   指定用于态度估计的参考框架。

您需要在deviceMotion属性生效之前开始动态更新。

编辑:

关于您发布的新代码:

您是否介入了代码以了解会发生什么? manager.isDeviceMotionAvailable评估为真吗?你的街区被叫了吗?

请注意,您已将OperationQueue传递给对manager.startDeviceMotionUpdates的调用,因此您传入的块将在后台线程上调用。因此,您需要将UI更新发送到主线程:

manager.startDeviceMotionUpdates(to: queue) {
  [weak self] (data: CMDeviceMotion?, error: Error?) in
  if let gravity = data?.gravity {
    let rotation = atan2(gravity.x, gravity.y) - M_PI
    //Change the image view's transform from the main thread.
    DispatchQueue.main.async() {
      self?.imageView.transform = CGAffineTransform(rotationAngle: CGFloat(rotation))
    }
  }
}

答案 1 :(得分:0)

我通过调用manager.startGyroUpdates()而非manager.startDeviceMotionUpdates()

来解决问题