iOS 10 UILabels - > 1 UIView - >循环使用动画

时间:2011-10-20 18:14:15

标签: objective-c ios animation uiview core-animation

我有10 UILabels,也许有UIImageViews。我希望在1 UIView中以平滑的FadeOut&显示所有这些内容。 FadeIn过渡,一个接一个。

我知道在for循环中放置UIView动画不起作用,因为动画是异步和异步的。不会产生适当的效果。所以我通常这样做的方法是将UIView动画链接在一起。即在一个元素动画完成后开始下一个。对于3-4个元素,代码看起来没问题。像这样 -

[UIView animateWithDuration:0.25 
                      delay:0 
                    options:UIViewAnimationCurveEaseInOut 
                 animations:^{ //do something with alpha here - first element } 
                 completion:^(BOOL finished){ 
                     [UIView animateWithDuration:0.25 
                             delay:0 
                             options:UIViewAnimationCurveEaseInOut 
                             animations:^{ //do something with alpha here - 2nd element} 
                                      completion:^(BOOL finished){ ... }

                 }

但对于10多个元素,它变得非常混乱。怎么会这样做呢?基本上我正在创建一个带有循环内容的UIView,就像一个小部件。

1 个答案:

答案 0 :(得分:6)

使用NSTimer而不是循环进行编辑。

counter是标题中定义的ivar。

 - (void)viewDidLoad
{
    [super viewDidLoad];
    counter = 0;
    [NSTimer scheduledTimerWithTimeInterval:0.30
                                     target:self
                                   selector:@selector(timerTick:)
                                   userInfo:nil
                                    repeats:YES];
}

- (void) timerTick:(NSTimer *)timer{

    UIView *currentView = [self.view.subviews objectAtIndex:counter];
    [UIView animateWithDuration:0.25 
                          delay:0 
                        options:UIViewAnimationCurveEaseInOut 
                     animations:^{ currentView.alpha = 1.0;}
                     completion:^(BOOL finished){
                         [UIView animateWithDuration:0.25 animations:^{currentView.alpha = 0.0;}];
                     }
    ];
    counter++;
    if (counter >= [self.view.subviews count]) {
        counter = 0;
    }
}