2016-11-02 78 views
2

我從Objective-C得到了以下代碼,它工作得很好。Swift 3 CMMotionManager startGyroUpdates不工作

_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東西。該文件說: - >處理程序後無效,但沒有幫助。所有的網頁代碼是雨燕2.

+1

將'motionManager'作爲一個實例變量工作。 –

回答

0

在你的類的方法試試這個:

// 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/3.X迅速測試和設備的iOS 9.2.1(14D27)

PS 一定要使用捕獲的列表,防止保留週期如果使用自:

{ [unowned self] in 
    ... 
}