Swift 3 CMMotionManager startGyroUpdates 不起作用
Posted
技术标签:
【中文标题】Swift 3 CMMotionManager startGyroUpdates 不起作用【英文标题】:Swift 3 CMMotionManager startGyroUpdates not working 【发布时间】:2016-11-02 14:51:27 【问题描述】:我从 Objective-C 获得了以下代码,效果很好。
_motionManager = [[CMMotionManager alloc] init];
_motionManager.gyroUpdateInterval = 1.0/60.0;
[_motionManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData *gyroData, NSError *error)
xAcceleration = gyroData.rotationRate.x;
yAcceleration = gyroData.rotationRate.y;
[self acceleratorUpdates];
];
我尝试将它转换为 Swift 3,但它不起作用,它给出了各种错误。到目前为止,我得到了这个代码。
let motionManager = CMMotionManager()
motionManager.gyroUpdateInterval = 1.0 / 60.0
motionManager.startGyroUpdates(to: OperationQueue.current!, withHandler: (gyroData: CMGyroData, error: Error)
var xAcceleration = gyroData.rotationRate.x
var yAcceleration = gyroData.rotationRate.y
print("xAcceleration: ", xAcceleration, "yAcceleration: ", yAcceleration)
)
我想我在 withHandler 部分遗漏了一些东西。文档是这样说的:->在处理程序之后无效,但这没有帮助。来自网络的所有代码都是 Swift 2。
【问题讨论】:
在将motionManager
作为实例变量后它工作了。
【参考方案1】:
在你的类的方法中试试这个:
// data members:
private var gyroPresent = false
private var manager : CMMotionManager?
..
self.manager = CMMotionManager()
guard self.manager != nil else
// never here.. but... to be sure.
print("no CMMotionManager")
return
self.gyroPresent = self.manager!.isGyroAvailable
guard self.gyroPresent else
print("no GyroScope")
return
self.manager!.gyroUpdateInterval = 0.1
// remember to stop it.. with: self.manager?.stopGyroUpdates()
self.manager!.startGyroUpdates(to: OperationQueue.main) (data: CMGyroData?, error: Error?) in
if let info = data?.rotationRate
print("\(info.x) \(info.z) \(info.z) ")
...
在 Xcode 8.2.1/swift 3.x 和设备 ios 10.2.1 (14D27) 上测试
PS 如果使用 self,请务必使用捕获列表来防止保留循环:
[unowned self] in
...
【讨论】:
以上是关于Swift 3 CMMotionManager startGyroUpdates 不起作用的主要内容,如果未能解决你的问题,请参考以下文章