CAKeyFrameAnimation терпит неудачу без любой подсказки - PullRequest
0 голосов
/ 20 февраля 2012

Ниже приведен мой фрагмент кода, я хочу реализовать анимацию непрозрачности, чтобы показать эффект дыхания на кнопке.

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];

  }
}

На самом деле, мне нужно знать остановку анимации дыхания, чтобы удалить два CALayer. Но у меня есть флаг NO в animationDidStop(), он указывает, что анимация не завершена должным образом, и анимация дыхания не показана. Затем я попытался не вызывать [self removeBreathAnimationLayers] для удаления двух CALayer, анимация работает хорошо.

У кого-нибудь есть предложения по этому вопросу? Мне действительно нужно знать, что анимация успешно остановилась, чтобы сделать что-то еще.

Ценю ваш ответ. Большое спасибо!

-Roby

1 Ответ

0 голосов
/ 21 февраля 2012

Я получил способ исправить эту проблему, добавив [CATransaction begin] и [CATransaction commit] в начале и конце раздела анимации.

Затем код выглядит следующим образом:

- (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];

}
}

Я новичок в основной анимации, хотелось бы, чтобы это помогло кому-то, кто столкнулся с этой проблемой.

-Roby

...