0

以下に私のコードセクションを示します。ボタンに息の効果を表示するために、不透明度のアニメーションを実装したいと思います。

NSString* kAnimation = @"animation";
NSString* kBreath = @"breath";
NSString* kHide = @"hide";
NSString* kOpacity = @"opacity";

- (void) breathAnimation {

      ................

      CAKeyframeAnimation *darkblueBreathAnimation = [CAKeyframeAnimation animationWithKeyPath:kOpacity];

      NSArray *darkblueOpacityValues = [NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0f],
                                        [NSNumber numberWithFloat:0.0f],
                                        [NSNumber numberWithFloat:1.0f],
                                        nil];

      NSArray *darkblueOpacityTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],
                                       [NSNumber numberWithFloat:0.5f],
                                       [NSNumber numberWithFloat:1.0f],
                                       nil];

      [darkblueBreathAnimation setValues:darkblueOpacityValues];

      [darkblueBreathAnimation setKeyTimes:darkblueOpacityTimes];

      [darkblueBreathAnimation setDuration:1.0f];


      [darkblueBreathAnimation setRepeatCount:2];

      [darkblueBreathAnimation setFillMode:kCAFillModeRemoved];

      [darkblueBreathAnimation setCalculationMode:kCAAnimationLinear];

      [darkblueBreathAnimation setRemovedOnCompletion:YES];

      [darkblueBreathAnimation setDelegate:self];

      [darkBlueLayer_ addAnimation:darkblueBreathAnimation forKey:kBreath];

      CAKeyframeAnimation *lightblueBreathAnimation = [CAKeyframeAnimation animationWithKeyPath:kOpacity];

      NSArray *lightblueOpacityValues = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],
                                        [NSNumber numberWithFloat:1.0f],
                                        [NSNumber numberWithFloat:0.0f],
                                        nil];

      NSArray *lightblueOpacityTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],
                                       [NSNumber numberWithFloat:0.5f],
                                       [NSNumber numberWithFloat:1.0f],
                                       nil];

      [lightblueBreathAnimation setValues:lightblueOpacityValues];

      [lightblueBreathAnimation setKeyTimes:lightblueOpacityTimes];

      [lightblueBreathAnimation setDuration:1.0f];

      [lightblueBreathAnimation setRepeatCount:2];

      [lightblueBreathAnimation setFillMode:kCAFillModeRemoved];

      [lightblueBreathAnimation setCalculationMode:kCAAnimationLinear];

      [lightblueBreathAnimation setRemovedOnCompletion:YES];

      [lightblueBreathAnimation setDelegate:self];

      [lightblueBreathAnimation setValue:kBreath forKey:kAnimation];

      [lightBlueLayer_ addAnimation:lightblueBreathAnimation forKey:kBreath];

    ...................

}

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

  NSString* value = (NSString*)[anim valueForKey:kAnimation];

  NSLog(@"Roby: value = %@", value);

  if ([[anim valueForKey:kAnimation] isEqualToString:kHide]) {

    //TODO

  } else if ([[anim valueForKey:kAnimation] isEqualToString:kBreath]) {

    [self removeBreathAnimationLayers];

  }
}

実際には、2つのCALayerを削除するために呼吸アニメーションが停止することを知っておく必要があります。しかし、フラグがNOでanimationDidStop()あることがわかりました。これは、アニメーションが正しく完了しておらず、呼吸アニメーションが表示されていないことを示しています。次に、[self removeBreathAnimationLayers]2つのCALayerを削除するために呼び出さないようにしましたが、アニメーションはうまく機能します。

誰かがこの問題について何か提案がありますか?私は本当に何か他のことをするためにアニメーションがうまく停止することを知る必要があります。

お返事ありがとうございます。どうもありがとう!

-ロビー

4

1 に答える 1

0

アニメーションセクションの最初と最後に[CATransactionbegin]と[CATransactioncommit]を追加することで、この問題を修正する方法を手に入れました。

次に、コードは次のようになります。

- (void) breathAnimation {

................
[CATransaction begin];

CAKeyframeAnimation *darkblueBreathAnimation = [CAKeyframeAnimation animationWithKeyPath:kOpacity];

NSArray *darkblueOpacityValues = [NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0f],
                                    [NSNumber numberWithFloat:0.0f],
                                    [NSNumber numberWithFloat:1.0f],
                                    nil];

NSArray *darkblueOpacityTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],
                                   [NSNumber numberWithFloat:0.5f],
                                   [NSNumber numberWithFloat:1.0f],
                                   nil];

[darkblueBreathAnimation setValues:darkblueOpacityValues];

[darkblueBreathAnimation setKeyTimes:darkblueOpacityTimes];

[darkblueBreathAnimation setDuration:1.0f];

[darkblueBreathAnimation setRepeatCount:2];

[darkblueBreathAnimation setFillMode:kCAFillModeRemoved];

[darkblueBreathAnimation setCalculationMode:kCAAnimationLinear];

[darkblueBreathAnimation setRemovedOnCompletion:YES];

[darkblueBreathAnimation setDelegate:self];

[darkBlueLayer_ addAnimation:darkblueBreathAnimation forKey:kBreath];

CAKeyframeAnimation *lightblueBreathAnimation = [CAKeyframeAnimation animationWithKeyPath:kOpacity];

NSArray *lightblueOpacityValues = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],
                                    [NSNumber numberWithFloat:1.0f],
                                    [NSNumber numberWithFloat:0.0f],
                                    nil];

NSArray *lightblueOpacityTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0f],
                                   [NSNumber numberWithFloat:0.5f],
                                   [NSNumber numberWithFloat:1.0f],
                                   nil];

[lightblueBreathAnimation setValues:lightblueOpacityValues];

[lightblueBreathAnimation setKeyTimes:lightblueOpacityTimes];

[lightblueBreathAnimation setDuration:1.0f];

[lightblueBreathAnimation setRepeatCount:2];

[lightblueBreathAnimation setFillMode:kCAFillModeRemoved];

[lightblueBreathAnimation setCalculationMode:kCAAnimationLinear];

[lightblueBreathAnimation setRemovedOnCompletion:YES];

[lightblueBreathAnimation setDelegate:self];

[lightblueBreathAnimation setValue:kBreath forKey:kAnimation];

[lightBlueLayer_ addAnimation:lightblueBreathAnimation forKey:kBreath];

[CATransaction commit];

...................

}

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

NSString* value = (NSString*)[anim valueForKey:kAnimation];

NSLog(@"Roby: value = %@", value);

if ([[anim valueForKey:kAnimation] isEqualToString:kHide]) {

//TODO

} else if ([[anim valueForKey:kAnimation] isEqualToString:kBreath]) {

[self removeBreathAnimationLayers];

}
}

私はコアアニメーションの初心者です。これがこの問題に遭遇した人の助けになることを願っています。

-ロビー

于 2012-02-21T02:06:15.413 に答える