0

CoreGraphicsとdrawRectを使用して歯車を描画するルーチンがあります。ボタンを使用して、ステージを介してギアを進めました。

-(IBAction)advanceButtonPressed:(id)sender {

stage=stage+1;

if (stage==4) stage=0;

[self setNeedsDisplay];

}

歯車を描画するためのルーチンはdrawRectにあり、歯車の歯は、drawRectに渡されるステージの値に応じて新しい位置に描画されます。ボタンを押すごとに1つずつ、4つのステップで、歯車が新しい位置(円の周りの1つのセグメント)に回転します。

buttonPressedルーチンを変更して、ループ内の4つのステージを実行するようにしたので、ボタンを1回押すだけで済みますが、機能しません。

-(IBAction)buttonPressed:(id)sender {

for (stage=0;stage<4;stage++){

    NSLog(@"%i",stage);

[self setNeedsDisplay];
}

}

私のNSLogは、前のルーチンの場合と同じように、ステージが4つの値を通過することを示しています。ただし、setNeedsDisplayは(drawRectのNSLogトレースで確認されるように)1回だけ実行されるため、ギアは最終位置に表示されますが、中間段階には表示されません。setNeedsDisplayは、ループ内にあるにもかかわらず、ボタンルーチンが終了したときにのみ実行されるようです。

強制的に実行する方法はありますか?

4

2 に答える 2

2

iPhoneは、電話をかける頻度に関係なく、画面を1秒間に60回しか更新しませんsetNeedsDisplay。ループは1/60秒未満で実行されます。そのため、最後の状態のみが表示されます。

ボタンを1回押すだけで4つの状態すべてを表示したい場合は、タイマーを使用するかperformSelector: afterDelay、4つの状態すべてを表示できます。もう少し複雑ですが、そこに行きます。

于 2013-01-06T23:49:58.383 に答える
-2

setNeedsDisplayを呼び出すと、次の描画サイクルで再描画されるビューにマークが付けられます。

メソッド中に再描画するには、drawRectを明示的に呼び出すことができます。

于 2013-01-06T23:41:40.820 に答える