iOS 10 UILabels -> 1 UIView -> Цикл с анимацией - PullRequest
2 голосов
/ 20 октября 2011

У меня 10 UILabels, может быть, немного UIImageViews.Я хочу отобразить все это в 1 UIView с плавным переходом FadeOut & FadeIn, один за другим.

Я знаю, что размещение UIView анимаций в цикле for не будет работать, так как анимации выполняются асинхронно и не дают должного эффекта.Таким образом, обычно я делаю это, объединяя анимацию 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 Ответ

6 голосов
/ 20 октября 2011

Отредактировано с помощью NSTimer вместо цикла.

counter - это ивар, определенный в заголовке.

 - (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;
    }
}
...