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