2011-11-29 9 views
7

私は加速度計のデータを取得するためにCMMotionManagerを使用しています。事は、加速度計データが定期的に印刷され、ビュー内でインスタンス変数が変更されますが、ビューが再描画されないことです。私はhvがゼロでないこと、そしてすべてがフックされていることを確認しました。ブロック内でsetNeedsDisplayを呼び出す際に問題はありますか?setNeedsブロック内で表示が機能しない

-(void) viewDidAppear:(BOOL) animated 
{ 
    [super viewDidAppear: animated]; 

    [motionManager startAccelerometerUpdatesToQueue:motionQueue withHandler: 
    ^(CMAccelerometerData *accelerometerData, NSError *error) 
    { 

     NSLog(@"%@",accelerometerData); 

     HypnosisView *hv = (HypnosisView *) [self view]; 

     hv.xShift = 10.0 * accelerometerData.acceleration.x; 
     hv.yShift = -10.0 * accelerometerData.acceleration.y; 

     [hv setNeedsDisplay]; 

    }];  
} 

答えて

12

これは、メインスレッドとは異なるスレッド上でUIメソッドを呼び出すためです。

は、あなたのブロックにこれを追加します。

dispatch_async(dispatch_get_main_queue(), ^{ 
    [hv setNeedsDisplay]; 
}); 

は、ユーザーインターフェイス要素を扱う任意の方法はメインスレッドから呼び出されなければならないことに注意してください。

+0

ブロックがブロックされています。 :) – Pascal

+0

それは問題を解決した – jorurmol

+0

ソリューションに感謝します。私が部外者であるので、ここで知識豊かな人を持つことは本当に良いことです。 –

4

他のブロックでも同じことを行いましたが、ここで使用するコールバックではありませんが、動作しました。ブロックがメインスレッドで実行されていない可能性がありますか?そうでない場合は

NSLog(@"Main thread? %d", [NSThread isMainThread]); 

、あなたはメインスレッドで実行するようにsetNeedsDisplayを強制することができます:あなたはしていることを確認することができます。

+0

はい、問題です。ありがとうございます! – jorurmol

0

@ cocoaheroの答えをテストしたかっただけです。私はsetTitleを非メインスレッドのUIButtonに呼び出そうとしました。タイトルは変更されました。 Xcode 5.0.1を使用してiOS 5.1と7.0の両方をターゲットにしました。また、私は非メインスレッドからsetNeedsDisplayと呼ばれ、それも働いた。

[NSThread isMainThread]私は自分の呼び出しがメインスレッドからではないことを確認しました。私は非メインスレッドからの呼び出しがあなたの問題の原因だとは思っていませんが、少なくともそこには他の可能性があります。別の質問についてはmy answerをご覧ください。

関連する問題