UIView blok tabanlı animasyonu nasıl iptal edebilirim?


86

Pek çok SO şeyi ve Apple'ın referanslarında aradım, ancak yine de sorunumu yönetemiyorum.

Neyim var:

  1. 2 UIImageViews ve 2 UIButtons bunlara bağlı bir ekran
  2. 2 çeşit animasyon:
    1. Her görüntünün arka arkaya, yalnızca bir kez yukarı ve sonra küçültülmesi viewDidLoad
    2. Bir düğmeye basıldığında (her birinin "içinde" gizlenen özel bir düğme UIImageView), uygun animasyonu tetikler - her ikisinin UIImageViewde değil, yalnızca birinin - (aynı zamanda yukarı, sonra aşağı ölçekleme).
    3. İOS4 + için yazarken bana blok tabanlı animasyonlar kullanmam söylendi!

Neye ihtiyacım var:

Çalışan bir animasyonu nasıl iptal ederim? Sonuncusu dışında iptal etmeyi başardım ...: /

İşte kod pasajım:

[UIImageView animateWithDuration:2.0 
                               delay:0.1 
                             options:UIViewAnimationOptionAllowUserInteraction 
                          animations:^{
        isAnimating = YES;
        self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
    } completion:^(BOOL finished){
        if(! finished) return;
        [UIImageView animateWithDuration:2.0 
                                   delay:0.0 
                                 options:UIViewAnimationOptionAllowUserInteraction 
                              animations:^{
            self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
        } completion:^(BOOL finished){
            if(! finished) return;
            [UIImageView animateWithDuration:2.0 
                                       delay:0.0 
                                     options:UIViewAnimationOptionAllowUserInteraction 
                                  animations:^{
                self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
            } completion:^(BOOL finished){
                if(! finished) return;
                [UIImageView animateWithDuration:2.0 
                                           delay:0.0 
                                         options:UIViewAnimationOptionAllowUserInteraction 
                                      animations:^{
                    self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
                }
                                      completion:^(BOOL finished){
                                          if (!finished) return;
                                          //block letter buttons
                                          [self.bigLetterButton setUserInteractionEnabled:YES];
                                          [self.smallLetterButton setUserInteractionEnabled:YES];
                                          //NSLog(@"vieDidLoad animations finished");
                                      }];
            }];
        }];
    }];

Her nasılsa smallLetter UIImageViewdüzgün çalışmıyor, çünkü (buton üzerinden) basıldığında bigLetteranimasyonları düzgün şekilde iptal ediyor ...

DÜZENLEME: Bu çözümü kullandım, ancak ölçek küçültme konusunda hala sorun yaşıyorum smallLetter UIImageView- hiç iptal etmiyorum ... çözüm

DÜZENLEME2: Bunu sonraki / önceki yöntemlerin başına ekledim:

- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

sorun devam ediyor ...: / animasyon zincirindeki harfler için son animasyonun nasıl kesileceği hakkında hiçbir fikrim yok


Hey, sanırım Hari Kunwar'ın cevabı şimdi kabul edilmelidir.
marczellm

Bugünlerde gerekir UIViewPropertyAnimator kullanmak - o da muazzam kolay.
Şişko

Yanıtlar:


151

Bir görünümdeki tüm animasyonları şu numarayı arayarak durdurabilirsiniz:

[view.layer removeAllAnimations];

(View.layer'da yöntemleri çağırmak için QuartzCore çerçevesini içe aktarmanız gerekir).

Tüm animasyonları değil, belirli bir animasyonu durdurmak istiyorsanız, yapabileceğiniz en iyi şey, UIView animasyon yardımcı yöntemlerinden ziyade CAAnimations'ı açıkça kullanmaktır, bu durumda daha ayrıntılı kontrole sahip olursunuz ve animasyonları adıyla açıkça durdurabilirsiniz.

Apple Core Animation belgeleri burada bulunabilir:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html


10
Eklemek istiyorum, kendi gözlemime göre, sonraki animateWithDuration, removeAllAnimations çağrıldıktan sonra artık çalışmıyor. Bu, sayfalandırma yapmak ve kontrolleri yenilemek için çekmek içindir, belki başka biri farklı bir şey gözlemleyebilir. CABasicAnimation'ı kullanmaya ve [myView.layer removeAnimationForKey: @ "animationKey"] 'i çağırmaya başladım;
Zhang

@Nick bahşiş için teşekkürler - bağlantının artık desteklenmediğine dikkat edin, bunun yerine şunu deneyin: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
trdavidson

view.layer.removeAllAnimations () add animate view tekrar çalışmıyor
Bunthoeun

52

İOS 10 için, animasyon uygulamak için UIViewPropertyAnimator'ı kullanın. UIView animasyonlarını başlatmak, durdurmak ve duraklatmak için yöntemler sağlar.

 let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
        self.view.alpha = 0.0
 }
 // Call this to start animation.
 animator.startAnimation()

 // Call this to stop animation.
 animator.stopAnimation(true)

3

RemoveAllAnimations'ın sonraki fikrinin çok kullanışlı olmasını sağlamak için Nick'in cevabına ekledim.

[view.layer removeAllAnimations];
[UIView transitionWithView:self.redView
                  duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                      [view.layer displayIfNeeded];
                  } completion:nil];

0

Bunu deneyebilirsiniz (Swift ile):

UIView.setAnimationsEnabled(false)
UIView.setAnimationsEnabled(true)

Not: Gerekirse bu iki arama arasına kod koyabilirsiniz, örneğin:

UIView.setAnimationsEnabled(false)
aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity
UIView.setAnimationsEnabled(true)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.