7

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

-(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];

    }];    
}
4

3 に答える 3

12

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

これをブロックに追加します。

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

ユーザーインターフェイス要素を処理するメソッドは、メインスレッドから呼び出す必要があることに注意してください。

于 2011-11-29T15:36:52.830 に答える
4

私は他のブロックでも同じことをしましたが、ここで使用するコールバックでは機能しませんでした。たぶん、ブロックはメインスレッドで実行されていませんか?あなたはそれをチェックすることができます:

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

setNeedsDisplayそうでない場合は、メインスレッドで実行するように強制できます。

于 2011-11-29T15:36:33.500 に答える
0

@cocoaheroの答えをテストしたかっただけです。setTitle非メインスレッドでUIButtonを呼び出そうとしました。そして、タイトルが変更されました。Xcode 5.0.1を使用して、iOS5.1と7.0の両方をターゲットにしてこれを試しました。またsetNeedsDisplay、メイン以外のスレッドから呼び出しましたが、それも機能しました。

[NSThread isMainThread]これが、自分の呼び出しがメインスレッドからのものではないことを確認する方法でした。非メインスレッドからの呼び出しが問題の原因であるかどうかはわかりませんが、少なくとも他の可能性があります。別の質問に対する私の答えを見てください。

于 2013-11-03T07:56:09.030 に答える