2011-07-26 7 views
0

私は、スクリーン上に6つのシートオブジェクト(アルファプロパティが0に設定されたUIView)のコレクションを持っており、基本的にプレーヤオブジェクトをその上に配置しています。座席には、その上にプレーヤーがいる場合とない場合があります。私が今持っているのは、プレイヤーのtouchesMovedイベントをプログラムして、プレーヤーをシートオブジェクトの上にドラッグすると、シートのアルファプロパティが0から0.6になるようにしています。そして、まだプレイヤーをドラッグしている間に、私は彼を座席から引き離すと、アルファプロパティは0に戻ります。ホバー上のアルファプロパティをアニメーションでアニメ化する

代わりに、アルファプロパティが変動するような組み込みのUIViewアニメーションがありますか? .6と.2の間に?鼓動効果の種類?これはコアアニメーションかもっと高度なものが必要でしょうか?

私は選手をドラッグすると、それは座席の上だかどうかを検出するためにプレーヤーのtouchesMovedメソッドで次のように使用しています:

UITouch *aTouch = [touches anyObject]; 
self.center = [aTouch locationInView:[self.superview]]; 
Seat *seat = [controller seatAtPoint:[aTouch locationInView:self.superview]]; 

if (seat) { 
self.hoverSeat = seat; 
    seat.alpha = .6; 
} else { 
    self.hoverSeat.alpha = 0; 
} 

次のように私のコントローラでseatAtPoint方法は次のとおりです。

- (Seat *) seatAtPoint:(CGPoint)point { 

NSMutableArray seats = [NSMutableArray arrayWithCapacity:6]; 

for (int i = 1; i <= 6; i++) { 
    Seat *aSeat = (Seat*)[self.view viewWithTag:i]; 
    [seats addObject:aSeat]; 
} 

for (Seat *seat in seats) { 
if (CGRectContainsPoint([seat frame], point)) { 
    return seat; 
} 
} 
return nil; 
} 

私は、ホバリングアイバーを使用して、プレーヤーがホバリングしている座席を保持します。返された座席がゼロの場合、座席のアルファは0に設定されます。

このコードで表示されるバグは、画面上でプレーヤーを少し早く動かすと、 0に戻ってください。誰ももっと効果的な方法を考えて、それが0に戻ることを保証できますか?

ありがとうございます。

答えて

2

私はCoreAnimationを使用します。それは使いにくいことではありません。ここでは、フェードのためにどのように見えるかです:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:.5]; 
seat.alpha = 1; 
[UIView commitAnimations]; 

あなたはおそらくにそれを設定することができますが、これらの使用のようなメソッドが条件と組み合わせたアニメーション(Trigerring other animation after first ending Animation (Objetive-C))をパルス状のいくつかの種類を作成するためのコールバックの中に見ることができます永遠にループする。 UIViewアニメーションは、実行中にユーザー入力を無効にすることにも注意してください(Infinitely looping animation)。

あなたが言及したバグについては、まだ起こっている場合は、起動時にすべての座席を反復し、正しく表示されていないものをチェックするタイマーを設定することができます。この間隔をかなり短く設定して、他のアニメーションのパフォーマンスに影響を与えないようにすることもできます。

関連する問題