2016-04-02 15 views
0

Bir animasyon gerçekleştirmek için UIModalPresentationOverCurrentContext'u kullanarak bir UIViewController modelini görüntülüyorum. messageVC içindeAnimasyon tamamlama bloğu bitmeden önce mi çalışıyor?

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

, bu yöntem adı:

-(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); } 
    }]; 
} 

ancak hideMessageWithBlock içindeki animasyon blok yerine 1.9 saniyelik bir gecikmeden sonra daha anında denir - aniden sekerek önce sıfıra etkisini belirler bulanıklaştırmak için. Bu neden?nil'a göre bir çeşit titremeler oluyor ve daha sonra bir saniyelik bir süre geçtikten sonra bulanıklaşmadan önce bulanıklaşıyor.

Düzenleme:

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' animasyonunun bahar animasyonuyla çalışacağından emin değilim. – Sulthan

+0

@sulthan hmm, garip. Titreşimsiz – Erik

+0

@ Paulw11 istisnasıyla doğru bir şekilde animasyon yapılabileceğini düşünürsek kısmen işe yarayabilir, ancak nasıl olmasa, eğer nervürlü olmasa bile niliyeti ayarlayarak tam olarak saydamlaşabilir misiniz? - Aslında olduğu gibi, titreşim – Erik

cevap

0

Ben UIView animasyon yöntemleri aslında değiştiriliyor canlandırılabilir özelliklerini belirlemek amacıyla derhal bloğu çalıştırmak şüpheli ve bu nedenle görsel efekt görünümü nil ayarlı ediliyor hemen, çünkü bu bir öngörülebilir özellik değildir.

animateWithDuration:animationDuration delay:...'u kullanmak yerine, basit bir animateWithDuration kullanabilir ve animasyonu geciktirmek için dispatch_after kullanabilirsiniz.

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); } 
    }]; 
});