我正在尝试为UILabel上的文字设置颜色的动画来从:[黑色]到[白色]到[黑色]并重复。
- (void)timerFlash:(NSTimer *)timer {
[[self navTitle] setTextColor:[[UIColor whiteColor] colorWithAlphaComponent:0.0]];
[UIView animateWithDuration:1
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{[[self navTitle] setTextColor:[[UIColor whiteColor] colorWithAlphaComponent:1.0]];}
completion:nil];
}
[self setFadeTimer:[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFlash:) userInfo:nil repeats:YES]];
首先,我不确定我的方法,我的计划(如上所示)是设置动画块并使用重复的NSTimer调用它直到取消。
我的第二个问题(正如你在上面看到的)是我从黑色(alpha 0)到白色(alpha 1)的动画,但我不知道如何再次动画回黑色以便动画无缝循环
基本上我想要的是UILabel上的文字颜色,直到用户按下按钮继续。
我遇到了麻烦,因为你无法动画[UILabel setColor:]但你可以动画[UILabel setAlpha:]所以我要给它一个去。
- (void)timerFlash:(NSTimer *)timer {
[[self navTitle] setAlpha:0.5];
[UIView animateWithDuration:2
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{[[self navTitle] setAlpha:0.9];}
completion:nil];
}
这是有效的(顺便说一句:我确实希望它停止,这就是为什么我把它连接到NSTimer,所以我可以取消它)唯一的事情就是这从midGray到nearWhite的动画然后弹出。有谁知道我会如何动画从nearWhite到midGray,所以我得到一个很好的平滑循环?
Dave DeLong(见下文)建议的代码在修改为使用CALayer不透明度样式属性时确实有效:
UILabel *navTitle;
@property(nonatomic, retain) UILabel *navTitle;
// ADD ANIMATION
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
[anim setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[anim setFromValue:[NSNumber numberWithFloat:0.5]];
[anim setToValue:[NSNumber numberWithFloat:1.0]];
[anim setAutoreverses:YES];
[anim setDuration:0.5];
[[[self navTitle] layer] addAnimation:anim forKey:@"flash"];
// REMOVE ANIMATION
[[[self navTitle] layer] removeAnimationForKey:@"flash"];
答案 0 :(得分:15)
您可以使用CAAnimation
执行此操作。我刚刚把我做过的一个小小的演示项目推到了github上。它显示奥林匹克标志,并使戒指飞到屏幕上的随机位置,然后动画回原始位置。您可能可能执行非常相似的操作,但显然不使用position
属性。
以下是让其中一个响起的基本代码:
CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"];
[a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[a setFromValue:[NSValue valueWithCGPoint:[layer position]]];
[a setToValue:[NSValue valueWithCGPoint:[self randomPoint]]];
[a setAutoreverses:YES];
[a setDuration:1.0];
[layer addAnimation:a forKey:nil];
您的fromValue
和toValue
值将为CGColorRefs
,您的动画密钥路径会有所不同,但此处的诀窍是setAutoreverses:YES
。这会从fromValue
到toValue
动画,然后再回到fromValue
。它非常方便。 :)
https://github.com/davedelong/Demos/blob/master/OlympicRings
如果这不起作用(也可能不起作用),那么我可能只将两个UILabels
叠加在一起,并同时将它们的alpha值设置为0.0到1.0(反之亦然)
答案 1 :(得分:9)
如果您只是想让它无限期地发生,您可以使用Dave DeLong的答案,或者:
[UIView animateWithDuration:1
delay:0
options:UIViewAnimationOptionAllowUserInteraction |
UIViewAnimationOptionAutoreverse |
UIViewAnimationOptionRepeat
animations:^{[[self navTitle] setTextColor:[UIColor whiteColor]];}
completion:nil];
使用CAAnimation的好处当然是您可以在以后删除动画;有了它,为了阻止你,你必须深入了解CALayer并找到动画来阻止它。
但是,您建议UILabel.textColor可能无法生成动画。这是可能的。如果是这样,您可以使用相同的技术在两个不同颜色的UILabel之间进行转换,然后淡化它们的alpha值。
答案 2 :(得分:1)
(与此处Cancel block in UIView animateWithDuration相同)
我只是重复动画并在一段时间后使用调度块将其终止:
- (void)animate // Blink a view three times
{
// We need to stop the animation after a while (0.9 sec)
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.9 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[view.layer removeAllAnimations];
view.alpha = 0.0; // Animation clean-up
});
[UIView animateWithDuration:0.15 // 0.15*6=0.9: It will animate six times (three in reverse)
delay:0.0
options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
animations:^{
view.alpha = 1.0; // Animation
}
completion:NULL];
}