0

これに苦労しています。アニメーション化しようとしているカスタム NSStatusItemView があります。アニメーションを開始するために、ステータス アイテム ビューに次のコードを追加しました。

- (void)setAnimated
{
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    anim.duration = 1.0;
    anim.repeatCount = HUGE_VALF;
    anim.autoreverses = YES;
    anim.fromValue=[NSNumber numberWithFloat:1.0];
    anim.toValue=[NSNumber numberWithFloat:0.0];
    [self.layer addAnimation: anim forKey: @"animateOpacity"];
    [self setWantsLayer:YES];  
    [self setNeedsDisplay:YES];
}

このメソッドを呼び出しても何も起こりません。しかし、このコードをdrawRectメソッドに移動すると、起動時にビューが適切にアニメーション化されます。事後にアニメーションを開始するように指示できるようにするために何をする必要があるかは完全にはわかりませんが、上記の方法ではそれが行われておらず、その理由がわかりません! 何か案は?

4

1 に答える 1

0

グーグルが答えの記録を持っているので、自分で答えてください!

問題は、ちょっと、drawRect の理解の欠如でした。私の setAnimated メソッドが setNeedsDisplay を呼び出すと、drawRect が再度呼び出され、setAnimated メソッドで行われたことを効果的に元に戻します。

これを適切に修正するために行ったことが 2 つあります。まず、setAnimated メソッドを変更して BOOL 引数を受け入れ、ビューの isAnimated プロパティをその値に設定しました。次に、drawRect でこの BOOL 値をチェックし、YES に設定されている場合はアニメーションを実行します。

次に、ビューが初めて描画されるときに [self setWantsLayer: YES] を呼び出す必要があるようです。したがって、最初に実行するときに drawRect でこれを呼び出して、後のアニメーションが機能するようにします。

于 2013-03-06T00:31:18.750 に答える