动画脉冲UILabel动画?

时间:2011-02-17 21:51:16

标签: iphone objective-c cocoa-touch

我正在尝试为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上的文字颜色,直到用户按下按钮继续。

EDIT_001:

我遇到了麻烦,因为你无法动画[UILabel setColor:]但你可以动画[UILabel setAlpha:]所以我要给它一个去。

EDIT_002:

- (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,所以我得到一个很好的平滑循环? enter image description here

EDIT_003 :(解决方案)

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

3 个答案:

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

您的fromValuetoValue值将为CGColorRefs,您的动画密钥路径会有所不同,但此处的诀窍是setAutoreverses:YES。这会从fromValuetoValue动画,然后再回到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];
}