2013-10-29 64 views
1

我無法弄清楚爲什麼滾動,俯仰和偏航值在登錄時給出了0.0000 ..我確定這是一個我想念的東西,但我無法弄清楚它..Devicemotion沒有更新值

這是代碼:

//ViewController.m 

#import "ViewController.h" 
@interface ViewController(){ 

} 
@property (nonatomic) CMMotionManager *motionManager; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    self.motionManager = [[CMMotionManager alloc] init]; 
    CMDeviceMotion *devMotion = [[CMDeviceMotion alloc]init]; 

    if ([self.motionManager isDeviceMotionAvailable]) { 
     NSLog(@"Device Motion Available"); 
     [self.motionManager setDeviceMotionUpdateInterval:1.0/30.0]; 
     // Pull mechanism is used 
     [self.motionManager startDeviceMotionUpdates]; 
    } 
    devMotion = self.motionManager.deviceMotion; 

    NSLog(@"Roll Pitch and Yaw are %f, %f, %f",devMotion.attitude.roll, devMotion.attitude.pitch, devMotion.attitude.yaw); 

} 

我已經通過這個類似的問題:SO Question

請幫助我瞭解這個..

謝謝..


更新的代碼:

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    self.motionManager = [[CMMotionManager alloc] init]; 

    if ([self.motionManager isDeviceMotionAvailable]) { 
     NSLog(@"Device Motion Available"); 
     [self.motionManager setDeviceMotionUpdateInterval:1.0/30.0]; 
     // Pull mechanism is used 
     [self.motionManager startDeviceMotionUpdates]; 
    } 
    CMDeviceMotion *devMotion = self.motionManager.deviceMotion; 
    NSLog(@"*Roll,Pitch and Yaw are %f, %f, %f",devMotion.attitude.roll, devMotion.attitude.pitch, devMotion.attitude.yaw); 

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(updateValues:) userInfo:nil repeats:YES]; 
} 

-(void) updateValues:(NSTimer *)timer{ 
    CMDeviceMotion *currDeviceMotion = self.motionManager.deviceMotion; 

    NSLog(@"Roll Pitch and Yaw are %f, %f, %f",currDeviceMotion.attitude.roll, currDeviceMotion.attitude.pitch, currDeviceMotion.attitude.yaw); 


} 

該代碼也有它的初始值作爲0.000000的很大一部分。之後,它開始變得值...所以我想有是向deviceMotion提供值一些延遲startDeviceMotionUpdates。所以看起來我需要弄清楚如何保存第一個非零值。

devMotion變量將不會舉行可用值(或全部)馬上爲 CMMotionManager
+0

你更新的代碼工作,是在我的iPhone 4S。您是否在使用沒有陀螺儀(或模擬器)的設備? –

+0

我也在使用iPhone 4s,現在它正在工作..請閱讀下面的代碼聲明。 :)我說的是,初始值是零。過了一段時間,它正在記錄非零值。但我想立即得到的值,這似乎是困難的,因爲devMotion變量將不會舉行可用值(或全部)馬上爲CMMotionManager需要一段時間startDeviceMotionUpdates後更新deviceMotion屬性,如你所說。 – iSeeker

+0

當陀螺儀啓動時,我認爲'currDeviceMotion'本身就是'nil',所以你可以測試一下。 –

回答

0
  • 通知需要一段時間startDeviceMotionUpdates後更新deviceMotion屬性。所以你應該有一些定期觸發的定時器並讀取該屬性。你的鏈接文章做類似的事情。
    • 只要陀螺儀啓動,deviceMotion屬性將爲空(你只看到0.0因爲消息nil返回零)。
  • 作爲旁註:您撥打[[CMDeviceMotion alloc] init]是無用的,因爲您隨後覆蓋變量,結果被分配給self.motionManager.deviceMotion
+0

謝謝..: )但我試圖宣佈它強大,我使用ARC ..它不工作。關於第二點,我已經爲此使用了一個計時器,我將更新問題...以及關於第三個問題..你能否讓它更清楚.. – iSeeker

+0

@iSeeker我需要看你的定時器處理程序代碼。計時器是否會啓動(嘗試在其中放入一個'NSLog')。關於最後一點:用Clang分析你的代碼(菜單「產品」→「分析」)也會向你顯示(作爲「死亡商店」)。 –

+0

好的..我明白,它不可能在startDeviceMotionUpdates之後馬上得到deviceMotion值。我想這可以解釋它..分析代碼部分對我來說實際上是新的...... :)所以將馬上嘗試。 。也會更新的問題:) – iSeeker