3

これは検索するのが少し難しいものでした。GoogleやSOに何をぶつけるべきかよくわからないので、以前に回答があった場合はお詫び申し上げます。

CALayerしたがって、5 秒間 (これは関係ありませんが)に適用する 2 つのアニメーションがあり、それらは無期限に繰り返されます。ユーザーの操作でこれらのアニメーションを適切に削除できるようにしたいと考えています。

インタラクションを検出するのは簡単ですが、アニメーションが 1 つのサイクルの最後に到達した時期を判断するのは簡単ではありません。これを検出することで、アニメーションが画面から厳しく削除されるのではなく、最後のサイクルを終了して停止するという効果を達成したいと考えています。

これは私が今していることであり、機能していません

- (void)attachFadeAnimation {

    // Create a fade animation that compliments the scale such that
    // the layer will become totally transparent 1/5 of the way
    // through the animation.
    CAKeyframeAnimation *fadeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
    fadeAnimation.values = @[@0.8, @0, @0];

    [self addAnimation:fadeAnimation withKeyPath:@"opacity"];

}

- (void)addAnimation:(CAKeyframeAnimation *)animation withKeyPath:(NSString *)keyPath {

    // These are all shared values of the animations and therefore
    // make more sense to be added here. Any changes here will
    // change each animation.
    animation.keyTimes = @[@0, @0.2, @1];
    animation.repeatCount = HUGE_VALF;
    animation.duration = 5.0f;
    animation.delegate = self;

    [self.layer addAnimation:animation forKey:keyPath];

}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {

    if ( !self.emanating )
        [self.layer removeAllAnimations];

}

へのデリゲート呼び出しanimationDidStop:finishedは、期待していたときに呼び出されません。明らかに、ドキュメントを誤解しています。

4

1 に答える 1

2

これを実現するためにデリゲート メソッドを使用できなかったので、Apple CoreAnimation のドキュメントを検索してCALayer、ビューに関連付けられている に、現在画面に表示されているものを説明する presentationLayer プロパティがあることを発見しました。

これを使用して、最初のアニメーションをより優雅に「終了」する別のアニメーションを作成することができました。

このコードは、実際には元のファイルとは別のファイルからのものですが、達成したい効果は同じです。

- (void)alert {

    CABasicAnimation *flashAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    flashAnimation.duration = 1.0f;
    flashAnimation.autoreverses = YES;
    flashAnimation.repeatCount = HUGE_VALF;
    flashAnimation.fromValue = (id)self.view.backgroundColor.CGColor;
    flashAnimation.toValue = (id)[UIColor colorWithRed:0.58f green:0.23f blue:0.14f alpha:1.0f].CGColor;

    [self.view.layer addAnimation:flashAnimation forKey:@"alert"];

}

- (void)cancelAlert {

    // Remove the flashing animation from the view layer.
    [self.view.layer removeAnimationForKey:@"alert"];

    // Using the views presentation layer I can interpolate the background
    // colour back to the original colour after removing the flashing
    // animation.
    CALayer *presentationLayer = (CALayer *)[self.view.layer presentationLayer];

    CABasicAnimation *resetBackground = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    resetBackground.duration = 1.0f;
    resetBackground.fromValue = (id)presentationLayer.backgroundColor;
    resetBackground.toValue = (id)_originalBackgroundColor.CGColor;

    [self.view.layer addAnimation:resetBackground forKey:@"reset"];

}
于 2013-09-08T23:31:27.387 に答える