我使用以下代码使标签中的文字闪烁:
- (void)blinkAnimation:(NSString *)animationID finished:(BOOL)finished target:(UILabel *) target {
NSString *selectedSpeed = [[NSUserDefaults standardUserDefaults] stringForKey:@"EffectSpeed"];
float speedFloat = (0.50 - [selectedSpeed floatValue]);
[UIView beginAnimations:animationID context:(__bridge void *)(target)];
[UIView setAnimationDuration:speedFloat];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(blinkAnimation:finished:target:)];
if([target alpha] == 1.0f)
[target setAlpha:0.0f];
else
[target setAlpha:1.0f];
[UIView commitAnimations];
}
我正在使用以下代码制作动画停止:
- (void) stopAnimation{
[self.gameStatus.layer removeAllAnimations];
}
虽然动画效果很好,但我无法阻止它。
你能帮忙吗?
提前致谢....
答案 0 :(得分:4)
问题是当您手动停止动画时正在调用animationDidStopSelector
,但该方法只是启动另一个动画。因此,您可以将其停止,但您可以立即启动另一个动画。
就个人而言,我建议摆脱animationDidStopSelector
并使用动画的自动反转和重复功能:
[UIView beginAnimations:animationID context:nil];
[UIView setAnimationDuration:speedFloat];
[UIView setAnimationDelegate:self];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationRepeatCount:CGFLOAT_MAX];
[target setAlpha:0.0f];
[UIView commitAnimations];
应该修复它,但正如holex所说,你应该使用块动画。我引用文档:"在iOS 4.0及更高版本中不鼓励使用此方法[beginAnimations
]。您应该使用基于块的动画方法来指定动画。"
因此,等效的块动画将是:
[UIView animateWithDuration:1.0
delay:0.0
options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
animations:^{
self.gameStatus.alpha = 0.0;
}
completion:nil];
无论您使用哪种技术,removeAllAnimations
现在都能按预期工作。
另外,当您停止动画时,它会立即将alpha
设置为零。停止重复动画然后将alpha
从当前值设置为所需的最终值可能更为优雅。要做到这一点,您需要从表示层抓取当前opacity
,然后将alpha
从该动画设置为您希望它停止的任何内容(在我的示例1.0中,但您可以也使用0.0):
CALayer *layer = self.gameStatus.layer.presentationLayer;
CGFloat currentOpacity = layer.opacity;
[self.gameStatus.layer removeAllAnimations];
self.gameStatus.alpha = currentOpacity;
[UIView animateWithDuration:0.25
animations:^{
self.gameStatus.alpha = 1.0;
}];