我正在尝试根据设备所处的角度旋转图像,但是当我实现我的代码时,图像没有任何反应。这是我的代码:
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
永远不会运行。我没有得到任何错误,我想知道问题是什么。任何帮助表示赞赏。
答案 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()