我想在iPad上闪烁一个UIImageview,我该如何做?

9

我希望让一个UIImageView闪烁几次。

目前我不知道怎么做。

实际代码:

-(void)arrowsAnimate{
    [UIView animateWithDuration:1.0 animations:^{
        arrow1.alpha = 1.0;
        arrow2.alpha = 1.0;
        arrow3.alpha = 1.0;
        NSLog(@"alpha 1");
    } completion:^(BOOL finished){        

        [self arrowsAnimate2];
                    
    }];
}

-(void)arrowsAnimate2{
    [UIView animateWithDuration:1.0 animations:^{
         arrow1.alpha = 0.0;
         arrow2.alpha = 0.0;
         arrow3.alpha = 0.0;
         NSLog(@"alpha 0");
    } completion:^(BOOL finished){;}];
}

之后我这样调用它:

for (int i = 0;i < 10; i++){
[self arrowsAnimate]; }

这给我10倍的alpha 1,然后是10倍的alpha 0。在中间我们只看到一个动画。 有任何建议吗?
谢谢。
4个回答

20

有一种更简单的方法可以使用仅一个动画块来实现闪烁动画:

aview.alpha = 1.0f;
[UIView animateWithDuration:0.5f
                      delay:0.0f 
                    options:UIViewAnimationOptionAutoreverse
                 animations:^ {
       [UIView setAnimationRepeatCount:10.0f/2.0f];
       aview.alpha = 0.0f;
} completion:^(BOOL finished) { 
       [aview removeFromSuperview]; 
}];    

关键是在您的动画块中使用[UIView setAnimationRepeatCount:NTIMES/2]; *_inside_*。不需要额外的函数或额外的循环。


1
哇,我没注意到你可以在块动画中使用一些旧的动画函数。这是有效的,并且符合文档要求。 - Mihai Damian
1
对于那些只想让它闪一次的人 - 摆脱 [UIView setAnimationRepeatCount:10.0f/2.0f]; - 取而代之,在完成块中将 alpha 设置回 1.0f。 - OverToasty

3

使用+(void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void(^)(void))animations completion:(void (^)(BOOL finished))completion 并在选项中传递 UIViewAnimationOptionRepeat 和可能的 UIViewAnimationOptionAutoreverse 。您不需要提供完成块并仅执行第一个动画。

编辑:这是一些示例代码,用于无限淡入淡出图像。

[UIView animateWithDuration:1.0 
                      delay:0.0 
                    options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse) 
                 animations:^{
                     self.myImageView.alpha = 1.0;
                 }
                 completion:NULL];

编辑2:我看到你实际上只需要将其闪烁10次。在使用块时,我实际上无法做到这一点。当完成块执行时,动画似乎立即完成了剩余的9次。但是,我可以很容易地通过旧式动画来完成这个操作。

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationRepeatCount:10.0];
[UIView setAnimationRepeatAutoreverses:YES];

self.myImageView.alpha = 1.0;

[UIView commitAnimations];

编辑 3: 我找到了使用代码块实现此功能的方法。
- (void)animate
{
    if (self.animationCount < 10)
    {
        [UIView animateWithDuration:1.0 
                         animations:^{
                             self.myImageView.alpha = 1.0;
                         }
                         completion:^(BOOL finished){
                             [self animateBack];
                         }];
    }
}

- (void)animateBack
{
    [UIView animateWithDuration:1.0 
                     animations:^{
                         self.myImageView.alpha = 0.0;
                     }
                     completion:^(BOOL finished){
                         self.animationCount++;
                         [self animate];
                     }];
}

听起来很不错,但我没能做到这一点,你能告诉我如何实现吗? - FreXxX
我刚刚更新了我的答案。我能够使用块使其无限运行,但不能在10次后停止。然而,我已经能够不使用块来实现,并提供了相应的代码。此外,@Bogatyr是正确的,你不可能连续调用10个动画并使它们很好地堆叠起来。 - Carl Veazey
非常感谢!不使用旧式动画有什么意义吗?我所知道的唯一一件事是,人们“应该”不使用它们,但其他方面是否受到影响呢?如果没有,那么就没有任何阻碍我使用旧式动画了!提前感谢您! - FreXxX
我从未听说过不使用它们的事情,但最近我一直在做很多向后兼容的应用程序,所以可能我不是很了解。据我所知,它们并没有被弃用,所以如果有帮助的话,我认为没有理由不去使用它们。编辑:苹果的文档说“在OS 4.0上不建议使用”,但没有明确说明原因,也没有标记为已弃用。 - Carl Veazey
我回去想了一下,用块来实现并编辑了我的答案。希望这能有所帮助。 - Carl Veazey
我印象深刻。谢谢!顺便说一下:“在iOS 4.0及更高版本中,不建议使用此方法。如果您正在使用基于块的动画方法,则可以直接在块内包含您的委托结束代码。” 来源:http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816 - FreXxX

1
在应用程序在闪烁时进入后台和前台时,上述闪烁可能无法正常工作。 您可以取一个透明图像和您的实际图像,然后对您的ImageView进行动画处理。
UIImageView *imageview=[UIImageView new];
imageview.animationDuration=1;
imageview.animationImages = your array of images;
[imageview startAnimating];

0

在启动新的动画之前,您需要等待当前动画完成。您可以在animate2中链接完成块以返回animate,并基于计数器属性停止,将循环实现在animate / completion块中而不是单独的循环中。


你能告诉我为什么会有区别吗?将计数器实现在块内部会有什么改变? - FreXxX
在我看来,你正在同时运行动画并相互干扰,至少它们都是并行工作而不是一个接一个地完成。因此,你只能看到“一个”动画。你需要确保一个动画运行并完成后再启动第二个动画,以此类推。 - Bogatyr
从NSLog输出来看,似乎首先运行10个alpha = 1的动画,然后再运行alpha = 0的动画,只进行了一个转换。我会进一步研究一下。 - FreXxX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接