2013-08-26 2 views
1

Я пытаюсь создать метод и вернуть тип BOOL из animateWithDuration. Но мой объект, кажется, не обнаружен в блоке завершения. может кто-нибудь объяснить мне, почему это может случиться?Как вернуть BOOL из animateWithDuration?

+ (BOOL)showAnimationFirstContent:(UIView *)view { 
    BOOL status = NO; 

    CGRect show = [SwFirstContent rectFirstContentShow]; 

    [UIView animateWithDuration:DURATION 
          delay:DELAY 
         options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ view.frame = show; } 
        completion:^(BOOL finished) { 
         status = YES; 
        }]; 
    return status; 
} 

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

ответ

3

Вы устанавливаете значение состояния внутри блока, который будет выполняться асинхронно , Смысл, ваш оператор возврата НЕ гарантированно будет выполнен после выполнения блока. Чтобы узнать, когда ваша анимация закончена, вам нужно объявить свой метод другим способом.

+ (void)showAnimationFirstContent:(UIView *)view completion:(void (^)(void))callbackBlock{ 

    CGRect show = [SwFirstContent rectFirstContentShow]; 

    [UIView animateWithDuration:DURATION 
          delay:DELAY 
         options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ view.frame = show; } 
        completion:^(BOOL finished) { 
         callbackBlock(); 
        }]; 
} 

И вы можете вызвать этот метод так:

[MyClass showAnimationFirstContent:aView completion:^{ 
//this block will be executed when the animation will be finished 
    [self doWhatEverYouWant]; 
}]; 

Вы можете прочитать немного больше о том, как block works.

Надеюсь, это поможет.

+1

Я пробую ваше решение и его работу. спасибо мамнун. –

2

Это происходит, поскольку блок выполняется асинхронно. Это означает, что после выполнения метода animateWithDuration метод showAnimationFirstContent будет продолжать выполнять (и в этом случае, если возврат), не дожидаясь анимации, чтобы закончить (и изменить логическое значение YES).

Вы должны возможно сохранить это логическое значение в качестве члена анимационного класса и выполнить метод в блоке завершения, чтобы справиться с этим булевым, когда анимация заканчивается

+0

спасибо giorashc, теперь я понимаю, почему мой объект не обнаружен на блоке. –