2014-11-02 3 views
1

Я хочу анимировать текст UILabel, чтобы он отображал один текст в течение нескольких секунд и после этого исчезал в текст по умолчанию.Fade между текстом в UILabel с задержкой

В настоящее время я использую следующий код:

-(void)tapOnBalance:(id)sender{ 
     [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
     cell.amountLabel.text = @"Hola!"; 
     } completion:nil]; 

     // Pause the function - act as a 'delay' 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]]; 

     [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
     cell.amountLabel.text = @"Hallo!"; 
     } completion:nil]; 

} 

Это работает, но [NSRunLoop currentRunLoop] во время паузы всех приложений, блокируя все в течение 3 секунд.

Как избавиться от блока на основной теме и получить тот же результат?

+1

Считаете ли вы использование параметра «delay» методов анимации? –

+0

Да, но они не работают на 'UILabels' – bdv

+1

Не знаю о нижнем, но (1) вам не нужно приостанавливать основной поток в этом случае ... вместо этого используйте блок завершения и задержка. (2) Проверьте этот ответ для получения справки о том, как правильно выполнить подобный переход UILabel: http://stackoverflow.com/a/16367409/2274694 –

ответ

1

Простой выцветанию (не Затенение) может идти, как это:

// change a label's text after some delay by fading 
// out, changing the text, then fading back in 
- (void)fadeLabel:(UILabel *)label toText:(NSString *)toText completion:(void (^)(BOOL))completion { 
    [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
     label.alpha = 0.0; 
    } completion:^(BOOL finished) { 
     label.text = toText; 
     [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ 
      label.alpha = 1.0; 
     } completion:completion]; 
    }]; 
} 

// simpler signature that can be done on a perform 
- (void)changeLabelText:(NSString *)toText { 
    [self fadeLabel:self.myLabel toText:toText completion:nil]; 
} 

// set the label to something, then change it with a fade, then change it back 
self.myLabel.text = @"text"; 
[self performSelector:@selector(changeLabelText:) withObject:@"hola!" afterDelay:4]; 
[self performSelector:@selector(changeLabelText:) withObject:@"text" afterDelay:8]; 

Вы можете также гнездо называют завершающие блоки (и добавить параметры задержки), чтобы сделать что-то подобное без преформ. Чтобы сделать перекрестное затухание, примените аналогичную технику с двумя метками (которые имеют один и тот же фрейм), где альфа равна нулю, а альфа альфа - одна.

+0

Это приводит к постепенному исчезновению всего 'UILabel', а мультипликационная анимация только анимирует текст, который я хочу. – bdv

+0

Вы говорите, что мне нужно объяснить, как сделать перекрестное увядание? – danh