2013-08-07 3 views
2

Я хочу запланировать серию анимаций, которые оживляют вводный текст по экрану. Самая последняя анимация, по завершении, должна скрыть логику игры, которая должна запускать игру.UIView animateWithDuration не соответствует задержке

Почему-то все происходит немедленно. Может ли кто-нибудь проливать свет на то, почему это происходит, или лучшая альтернатива?

[self.view bringSubviewToFront:_ViewIntroSeconds]; 

[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut 
       animations:^(void) { 
        [_IntroLabel1 setAlpha:1]; 
       } 
       completion:^(BOOL finished){ 
       }]; 

[UIView animateWithDuration:0.4 delay:3.0 options:UIViewAnimationOptionCurveEaseInOut 
       animations:^(void) { 
        [_IntroLabel2 setAlpha:1]; 
        [_IntroLabel1 setAlpha:0]; 
        [_IntroLabel1 setCenter:CGPointMake(0, _IntroLabel1.center.y)]; 
       } 
       completion:^(BOOL finished){ 
       }]; 

[UIView animateWithDuration:0.4 delay:5.0 options:UIViewAnimationOptionCurveEaseInOut 
       animations:^(void) { 
        [_IntroLabel3 setAlpha:1]; 
        [_IntroLabel2 setAlpha:0]; 
        [_IntroLabel2 setCenter:CGPointMake(0, _IntroLabel2.center.y)]; 
       } 
       completion:^(BOOL finished){ 
        [self updateGame]; 
        [self updateClock]; 

        [_ViewIntroSeconds setAlpha:0]; 
       }]; 

ответ

3

Мое предложение было бы установить delay до 0, и поместить последующие UIView анимационные блоки в completion блоке предыдущих animateWithDuration заявления:

[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut 
       animations:^(void) { 
        [_IntroLabel1 setAlpha:1]; 
       } 
       completion:^(BOOL finished){ 
        [UIView animateWithDuration:0.4 delay:2.6 options:UIViewAnimationOptionCurveEaseInOut 
             animations:^(void) { 
              [_IntroLabel2 setAlpha:1]; 
              [_IntroLabel1 setAlpha:0]; 
              [_IntroLabel1 setCenter:CGPointMake(0, _IntroLabel1.center.y)]; 
             } 
             completion:^(BOOL finished){ 
              [UIView animateWithDuration:0.4 delay:1.6 options:UIViewAnimationOptionCurveEaseInOut 
                  animations:^(void) { 
                   [_IntroLabel3 setAlpha:1]; 
                   [_IntroLabel2 setAlpha:0]; 
                   [_IntroLabel2 setCenter:CGPointMake(0, _IntroLabel2.center.y)]; 
                  } 
                  completion:^(BOOL finished){ 
                   [self updateGame]; 
                   [self updateClock]; 

                   [_ViewIntroSeconds setAlpha:0]; 
                  }]; 
             }]; 
       }]; 

Это даст вам желаемый эффект.

EDIT: Причина этого заключается в том, что блок UIView animateWithDuration начинает анимацию и переходит к выполнению следующего кода, пока анимация все еще действует. Следовательно, рекомендуется выполнять «следующие» анимационные эффекты в блоке завершения. В противном случае все запросы animateWithDuration будут выполнены почти мгновенно.

EDIT 2: Я редактировал delay в блоках, чтобы дать вам иллюзию 0, 3 и 5 секунд соответственно.

+0

Хорошая идея, но я хочу, чтобы продолжительность анимации и задержка между следующей анимацией были разными – Chris

+0

Затем измените 'delay' вы хотите в соответствующих' animateWithDuration' блоках. Имейте в виду, что 'delay' будет кумулятивным. Если вы установите задержки в 1, 2 и 3 секунды в блоке, они будут вызываться время от времени: 1, 3 и 6 секунд. – n00bProgrammer

+0

Красиво сделано, спасибо! – Chris

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