2016-04-02 18 views
0

Я показываю UIViewController с использованием UIModalPresentationOverCurrentContext, чтобы выполнить анимацию.Запуск блока анимации до завершения?

[self presentViewController:messageVC animated:NO completion:^{ 
[messageVC displayMessageAutoReversed:YES withBlock:^(BOOL finished) { 
    if (finished) { 
     [messageVC dismissViewControllerAnimated:YES completion:nil]; 
    } 
}]; 
}]; 

внутри messageVC, этот метод вызывается:

-(void)displayMessageAutoReversed:(BOOL)autoReversed withBlock:(void (^)(BOOL finished))handler { 
    NSTimeInterval animationDuration = 0.4; 

    [UIView animateWithDuration:animationDuration delay:0 usingSpringWithDamping:1.5 initialSpringVelocity:2.5f options:UIViewAnimationOptionTransitionNone animations:^{ 

     self.visualEffectView.effect = [UIBlurEffect effectWithStyle:self.blurEffectStyle]; 
     self.messageLabel.alpha = 1.0f; 
     self.imageView.alpha = 1.0f; 

    }completion:^(BOOL finished) { 
     if (finished) 
     { 
      if (autoReversed) 
      { 
       [self hideMessageWithBlock:^(BOOL finished) { 
        if (handler) { handler(finished); } 
       }]; 
      } else 
      { 
       if (handler) { handler(finished); } 
      } 
     } 
    }]; 
} 

-(void)hideMessageWithBlock:(void (^)(BOOL finished))handler { 
    NSTimeInterval animationDuration = 0.4; 

    [UIView animateWithDuration:animationDuration delay:animationDuration + 1.5 usingSpringWithDamping:1.5 initialSpringVelocity:2.5f options:UIViewAnimationOptionTransitionNone animations:^{ 

     self.visualEffectView.effect = nil; 
     self.messageLabel.alpha = 0.0f; 
     self.imageView.alpha = 0.0f; 

    }completion:^(BOOL finished) { 
     if (handler) { handler(finished); } 
    }]; 
} 

но блок анимации внутри hideMessageWithBlock называется мгновенно, а не после того, как второй задержки 1.9 - который устанавливает эффект до нуля, прежде чем он внезапно отскакивает назад к размытому. Почему это? Этот вид мерцает до nil, а затем возвращается к размытому, прежде чем он исчезает правильно после другой секунды.

Edit:

double delayInSeconds = 2.0; 
dispatch_time_t reverseTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(reverseTime, dispatch_get_main_queue(), ^(void) { 
    /* put whole animation block here? */ 
}); 
+0

Я не уверен, что анимация «visualEffectView» будет работать с анимацией весны. – Sulthan

+0

@sulthan хм, странно. Должен быть хорошо работающим, учитывая, что он анимирован правильно, за исключением мерцания – Erik

+0

@ Paulw11 кажется правдоподобным, но почему вы можете потушить/оживить размытие до полностью прозрачного, установив нуль, если он не анимируется? - Как есть на самом деле анимация, всего через секунду или два после мерцания. – Erik

ответ

0

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

Вместо того, чтобы использовать animateWithDuration:animationDuration delay:..., вы можете использовать простой animateWithDuration и использовать dispatch_after для задержки анимации.

double delayInSeconds = 1.9; 
dispatch_time_t reverseTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(reverseTime, dispatch_get_main_queue(), ^(void) { 
    [UIView animateWithDuration:animationDuration delay:0 usingSpringWithDamping:1.5 initialSpringVelocity:2.5f options:UIViewAnimationOptionTransitionNone animations:^{ 

     self.visualEffectView.effect = nil; 
     self.messageLabel.alpha = 0.0f; 
     self.imageView.alpha = 0.0f; 

    }completion:^(BOOL finished) { 
     if (handler) { handler(finished); } 
    }]; 
}); 
Смежные вопросы