0

接続状態を追跡するNSViewがあるOSXアプリケーションで作業しています。接続がアップしている場合は緑色の点が表示され、接続がダウンしている場合は赤色のドットが表示されます。

Core Animationを使用してこれをアニメーション化したかったのですが、接続状態が急激に変化する状況で問題が発生します。アニメーションは別のスレッドで発生し、ブロックされないため、ビューの現在の場所を取得するときに、それがまだアニメーション化されている場合は、必要なものの中間にあるものを取得します。

たとえば、NSView内に@property、状態を設定し、緑と赤のドットをアニメーション化するためにオーバーライドしているconnectionStateという名前があります。

- (void)setConnectionState:(BOOL)online
{
   NSPoint newPosition;
   if (online) { 
      newPosition = NSMakePoint(self.iconView.frame.origin.x, 
                                self.iconView.frame.origin.y + 32);
   } else { 
      newPosition = NSMakePoint(self.iconView.frame.origin.x, 
                                self.iconView.frame.origin.y - 32);
   }

   [NSAnimationContext beginGrouping];
   [[NSAnimationContext currentContext] setDuration:0.5];
   [self.iconView.animator setFrameOrigin:newPosition];
   [NSAnimationContext endGrouping];

   _connectionState = online;
}

ご覧のとおり、接続状態が急激に変化すると、self.iconView.frame正しくなく、newPosition位置がずれてしまいます。

私が見たいのは、ビューがそれ自体をアニメーション化し、完了するまで待ってから、もう一度それ自体をアニメーション化することです。

while(true)おそらく解決策は、キューを作成し、接続状態情報を1つのスレッドのキューに追加し続け、そのキューからプルし、アニメーション化し、待機するステートメントを持つ別のスレッドをバックグラウンドに置くことだと思いました。完了のために、そしてこの広告を無限に行います。ただし、これは非常に不格好な解決策のようです。

問題を解決するための正しいデザインパターンは何ですか?

4

2 に答える 2

1

正しい解決策は、ビューの現在の状態に基づく値を使用するのではなく、アニメーション化する実際の値を知ることであるように思われます(これは何でもかまいません)

- (void)setConnectionState:(BOOL)online
{
   const NSPoint kViewOnPosition = {...} ;
   const NSPoint kViewOffPosition = {...} ;

   NSPoint newPosition = online ? kOnPosition : kOffPosition ;

   [NSAnimationContext beginGrouping];
   [[NSAnimationContext currentContext] setDuration:0.5];
   [self.iconView.animator setFrameOrigin:newPosition];
   [NSAnimationContext endGrouping];

   _connectionState = online;
}
于 2012-07-15T21:07:57.390 に答える
0

残念ながら、Mac OS X 10.7でのみ利用可能ですが、アニメーションがいつ完了したかを検出するために使用できるsetCompletionHandler:メソッドがありNSAnimationContextます(したがって、開始時にフラグをどこかに設定し、ハンドラーでそのフラグの設定を解除して、アニメーションの完了をマークします) 。そうすれば、別のアニメーションが開始されるはずのときに、すでに進行中のアニメーションがあるかどうかを知ることができます。

(もっと良い方法があるといいのですが、これが私に起こります。)

于 2012-07-15T20:54:40.983 に答える