私は小さな画面を書こうとしていますが、メイン画面で飛んでいる "バブル"をアニメーションします。このアニメーションは連続していなければなりません。 (私はスクリーンから飛び出した泡を再利用します)UIを変更するすべての操作と同じように、アニメーションをメインスレッドで実行する必要があると聞きました。これは本当ですか?この画面でUIAlertViewを表示しようとすると、バブルアニメーションが連続しているためアニメーションが非常に曖昧になります。 (これはインジケータ付きのカスタムアラートビューです)デバイスはiPhone 4なので、通常のUIAlertViewを表示するのは問題ではないと思います。継続的なアニメーションの間、UClertViewのアニメーション化を回避しますか?
バブルアニメーションに正しい方法を使用するかどうかを質問したいと思います。まず第1に、NSTimerを使用します。これは0.01秒ごとにstartAnimation
メソッドを呼び出します(コントローラのviewDidAppear:
メソッドで起動します)。 startAnimation
メソッドでは、まず、xとyのランダムな座標を持つバブルを生成します(viewdidが現れた直後に画面にバブルが表示されます)。そして、xとy = 460のランダムな座標でバブルを生成します。 startAnimationメソッドでは、カウンタ(フレームと呼ばれます)を実行します。このカウンタの値が35になると、再びバブル生成メソッドを呼び出します。
問題:
Iは、別の配列の配列中に発生した気泡、及び(画面オフ)「ゴーン」気泡を格納します。最初に、私は泡消しの配列の泡を再利用しようとすると、配列がなくなると新しい泡ができます。この操作が処理されている間、連続アニメーションは停止し、次に続行されます。休憩は約1秒ですが、これは非常に邪魔です。 誰でもこの問題を解決できますか?アドバイスのおかげでは、マグカップクラスで
- (void)viewDidAppear {
.
timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(startAnimation) userInfo:nil repeats:YES];
.
}
- (void)startAnimation {
self.current = [NSDate timeIntervalSinceReferenceDate];
double diff = (self.start - self.current);
if (diff < 0) {
diff = (-1) * diff;
}
self.start = self.current;
frames++;
if (shouldMoveBubbles) {
[mug moveBubbles:diff];
}
if (frames == 35) {
DebugLog(@"################################################################");
DebugLog(@"####################### FRAME = 35 ###########################");
DebugLog(@"################################################################");
[mug createNewBubbleOnTheBottomOfView:self.view];
frames = 0;
}
}
をmadik:
- (void)moveBubbles:(double)millisElapsed {
for (Bubble *bubble in bubbles) {
int bubbleSpeed = bubble.speed;
float deltaX = (float)(bubbleSpeed * -degrees_sinus * millisElapsed * 100);
float deltaY = (float)(bubbleSpeed * -degrees_cosinus * millisElapsed);
DebugLog(@"movebubbles x: %f, y:%f, speed: %d, sin:%f, cos:%f", deltaX, deltaY, bubbleSpeed, degrees_sinus, degrees_cosinus);
[bubble moveBubbleX:deltaX Y:deltaY];
}
}
バブルクラスで:
- (void)moveBubbleX:(float)deltaX Y:(float)deltaY {
self.bubbleImage.center = CGPointMake(self.bubbleImage.center.x + deltaX, self.bubbleImage.center.y + deltaY);
}
このような意味で「言葉遣い」とはどういう意味ですか? – Moshe
アクティビティインジケータを使ってアラートビューを想像してみてください。それを表示しようとすると(バブルアニメーションを覚えておいてください)、非常にゆっくりと表示され、アクティビティインジケータのアニメーションがつまって固執しています。アラートビューを閉じると、非常にゆっくりと消えます。だからプロセス全体が非常に遅いです。 – madik
それはメモリの問題のように聞こえます。私は 'Build and Analyze'を使ってこれをソートすることをお勧めします。 – Moshe