2013-02-16 4 views
1

Я использую следующий код, чтобы сделать текст метки мигают:не удается остановить анимацию

- (void)blinkAnimation:(NSString *)animationID finished:(BOOL)finished target:(UILabel *) target { 

    NSString *selectedSpeed = [[NSUserDefaults standardUserDefaults] stringForKey:@"EffectSpeed"]; 
float speedFloat = (0.50 - [selectedSpeed floatValue]); 

    [UIView beginAnimations:animationID context:(__bridge void *)(target)]; 
    [UIView setAnimationDuration:speedFloat]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(blinkAnimation:finished:target:)]; 

    if([target alpha] == 1.0f) 
     [target setAlpha:0.0f]; 
    else 
     [target setAlpha:1.0f]; 

    [UIView commitAnimations]; 
} 

и я использую следующий код, чтобы сделать анимацию Stop:

- (void) stopAnimation{ 

    [self.gameStatus.layer removeAllAnimations]; 
} 

Хотя анимации отлично работает, я не могу это остановить.

Не могли бы вы помочь!

Заранее спасибо ....

+0

... почему вы не используете анимацию на основе блоков? – holex

ответ

4

Проблема в том, что ваш animationDidStopSelector вызывается, когда вы вручную остановить анимацию, но этот метод только начинает другую анимацию. Таким образом, вы прекращаете это нормально, но вы сразу же снимаете другую анимацию.

Лично я предлагаю избавиться от animationDidStopSelector и использовать AutoReverse и повторить особенности анимации:

[UIView beginAnimations:animationID context:nil]; 
[UIView setAnimationDuration:speedFloat]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationRepeatAutoreverses:YES]; 
[UIView setAnimationRepeatCount:CGFLOAT_MAX]; 
[target setAlpha:0.0f]; 
[UIView commitAnimations]; 

Это должно исправить это, но, как holex сказал, вы должны использовать блок анимации. Я цитирую из документации: «Использование этого метода [beginAnimations] не рекомендуется в iOS 4.0 и более поздних версиях. Вместо этого вы должны использовать методы анимации на основе блоков».

Таким образом, эквивалентный блок анимации будет:

[UIView animateWithDuration:1.0 
         delay:0.0 
        options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat 
       animations:^{ 
        self.gameStatus.alpha = 0.0; 
       } 
       completion:nil]; 

Какой бы метод вы используете, ваш removeAllAnimations теперь будет работать, как ожидалось.

Как в стороне, когда вы останавливаете анимацию, она немедленно установит alpha на ноль. Возможно, было бы более изящным остановить повторяющуюся анимацию, а затем оживить alpha от текущего значения до желаемого конечного значения. Чтобы сделать это, вы захотите захватить текущий opacity с уровня презентации, а затем оживить alpha от этого до того, что вы хотите остановить (в моем примере 1.0, но вы также можете использовать 0.0):

CALayer *layer = self.gameStatus.layer.presentationLayer; 
CGFloat currentOpacity = layer.opacity; 

[self.gameStatus.layer removeAllAnimations]; 

self.gameStatus.alpha = currentOpacity; 
[UIView animateWithDuration:0.25 
       animations:^{ 
        self.gameStatus.alpha = 1.0; 
       }]; 
+0

Он отлично работал ... Я действительно благодарю вас, Роб ...! – Kostas

Смежные вопросы