UIView animasyon iptal edilsin mi?

oy
221

Bir iptal etmek mümkün mü UIViewonu devam ederken animasyon? Yoksa CA seviyesine düşmesi olurdu?

yani ben (belki de bir son animasyon eylemi ayarlama) böyle bir şey yaptık:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

animasyon tamamlar ve ben animasyon sona olay ulaşmadan Ama (kısa kesmek) iptal etmek istiyorum. Mümkün mü? ve bitti edilemeyeceğini spekülasyon bir veya iki kişi - etrafında Googling birkaç cevapsız aynı soruyu soran kişiyi bulur.

Oluştur 17/02/2009 saat 00:19
kaynak kullanıcı
Diğer dillerde...                            


17 cevaplar

oy
342

kullanın:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
Cevap 19/03/2010 saat 07:53
kaynak kullanıcı

oy
111

Bunu yapmak yolu bitiş noktasına yeni bir animasyon yaratmaktır. Çok kısa bir süre ayarlayın ve kullanmak emin olun +setAnimationBeginsFromCurrentState:şu anki durumundan başlamak yöntemi. Eğer EVET olarak ayarlayın, geçerli animasyon kısa kesilir. Böyle bir şey görünüyor:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.1];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];
Cevap 08/05/2009 saat 22:46
kaynak kullanıcı

oy
61

Durdurmak için basit yolu , tüm bir görünümüyle ilgili animasyonlar, hemen şudur ki:

QuartzCore.framework projeyi bağlayın. Kodunuzdaki başında:

#import <QuartzCore/QuartzCore.h>

Eğer parçalarını bir görünüm ölü tüm animasyonlar durdurmak istediğinizde Şimdi, bu demek:

[CATransaction begin];
[theView.layer removeAllAnimations];
[CATransaction commit];

orta hat tek başına bütün çalışacak, ama runloop bitinceye kadar bir gecikme ( "anı yeniden çizmek") var. görüldüğü gibi bu gecikmeyi önlemek için, açık bir işlem bloğunda komutu sarın. başka değişiklik sağlanan bu eserler geçerli runloop bu katman üzerinde yapılmıştır.

Cevap 04/01/2012 saat 00:03
kaynak kullanıcı

oy
43

IOS 4 ve daha fazla günü, kullanma UIViewAnimationOptionBeginFromCurrentStateseçeneği kısa birinci animasyon kesmek için ikinci animasyon üzerinde.

Örnek olarak, bir etkinlik göstergeli bir görünüme sahip varsayalım. Sen aktiviteyi tüketen bazı potansiyel zaman başlar iken aktivite göstergesi solmaya ve etkinlik bittiğinde dışarı solmaya istiyoruz. Aşağıdaki kodu, üzerinde aktivite göstergesi ile görünüm olarak adlandırılır activityView.

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}
Cevap 11/08/2011 saat 09:30
kaynak kullanıcı

oy
39

sadece şu anda UIView animasyon dışında, animasyonlu ediliyor özelliğini ayarlamanız gerekir bir animasyon iptal etmek. nerede olursa olsun bu animasyonu durur ve UIView sadece tanımlanmış ayara atlayacaktır.

Cevap 19/06/2010 saat 18:09
kaynak kullanıcı

oy
9

Diğer yöntemlerin bir görünüm özelliği hiçbiri yerine sabit değiştirerek kısıtlamayı animasyon ise iOS 8 üzerinde çalışmak.

Örnek animasyonu:

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

Çözüm:

Sen kısıt değişikliği ve bunların alt katmanlar etkilenmeden herhangi görüşlerin katmanlardan animasyonlar kaldırmak gerekir.

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}
Cevap 07/11/2014 saat 17:21
kaynak kullanıcı

oy
8

Bu yanıt diriltmek için üzgünüm, ama iOS'ta 10 şey tür değişti ve şimdi iptal mümkündür ve hatta incelikle iptal edebilirsiniz!

IOS 10 sonra animasyonları iptal edebilirsiniz UIViewPropertyAnimator !

UIViewPropertyAnimator(duration: 2, dampingRatio: 0.4, animations: {
    view.backgroundColor = .blue
})
animator.stopAnimation(true)

Eğer doğruysa geçerseniz o animasyon iptal eder ve bunu iptal nereye doğru durur. tamamlanma yöntemi denilen edilmeyecektir. Eğer yanlış geçirirseniz Ancak, animasyon bitirme sorumludur:

animator.finishAnimation(.start)

Eğer animasyon bitirmek ve mevcut durum (.Current) kalmak ya da ilk devlet (.Start) gitmek veya son durumuna (.end) olabilir

Bu arada, hatta durdurabilir ve daha sonra yeniden başlatabilirsiniz ...

animator.pauseAnimation()
animator.startAnimation()

Not: Eğer animasyon ters ve hatta bunu duraklatışınızda Animasyonunuzu değiştirebilir iptal ani istemiyorsanız!

Cevap 09/11/2017 saat 17:57
kaynak kullanıcı

oy
7

Sadece duraklatmak istiyorsanız / sorunsuz animasyon durdurmak

self.yourView.layer.speed = 0;

Kaynak: Bir katman ağacının animasyonu duraklatmak nasıl

Cevap 29/06/2015 saat 11:02
kaynak kullanıcı

oy
5
[UIView setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];
Cevap 06/02/2015 saat 05:30
kaynak kullanıcı

oy
5

Yukarıdakilerin hiçbiri benim için çözüldü, ancak bu yardımcı: UIViewanimasyon derhal özelliğini ayarlar, sonra canlandırır. Sunum katmanı modeli (set mülk) eşleştiğinde Bu animasyonu durur.

Ben ( 'sen' görünümü anlamında) "Ben size görünür gibi görünmek yerden animasyon istiyorum" benim sorunu çözüldü. İsterseniz daha sonra, BU:

  1. QuartzCore ekleyin.
  2. CALayer * pLayer = theView.layer.presentationLayer;

Sunum tabakasına konumunu ayarlamak

Ben dahil olmak üzere birkaç seçeneklerini kullanmak UIViewAnimationOptionOverrideInheritedDuration

Apple'ın belgelerine belirsiz olduğu için, ben gerçekten diğer animasyonlar geçersiz kılar ise kullanıldığında biliyorum, ya da sadece sayaçlarını sıfırlar yok.

[UIView animateWithDuration:blah... 
                    options: UIViewAnimationOptionBeginFromCurrentState ... 
                    animations: ^ {
                                   theView.center = CGPointMake( pLayer.position.x + YOUR_ANIMATION_OFFSET, pLayer.position.y + ANOTHER_ANIMATION_OFFSET);
                   //this only works for translating, but you get the idea if you wanna flip and scale it. 
                   } completion: ^(BOOL complete) {}];

Ve bu şimdilik iyi çözüm olmalıdır.

Cevap 16/08/2011 saat 18:21
kaynak kullanıcı

oy
1

Ben aynı sorun var; API'ler bazı özel animasyon iptal etmek bir şey yok.

+ (void)setAnimationsEnabled:(BOOL)enabled

TÜM animasyonlar devre dışı bırakır ve böylece benim için çalışmaz. İki çözüm var:

1) Animasyonlu bir subview nesne yapmak. bu görünümde animasyonlar iptal etmek istediğiniz Ardından, görünümünü kaldırmak veya gizlemek. Çok basit, ama sen görünümünde tutmak gerekiyorsa animasyonlar olmadan subview yeniden oluşturmanız gerekir.

2) anim tek tekrarlamak ve bunun gibi, gerekirse anim yeniden başlatmak için bir temsilci seçicisi:

-(void) startAnimation {
NSLog(@"startAnim alpha:%f", self.alpha);
[self setAlpha:1.0];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationRepeatCount:1];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(pulseAnimationDidStop:finished:context:)];
[self setAlpha:0.1];
[UIView commitAnimations];
}

- (void)pulseAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
if(hasFocus) {
    [self startAnimation];
} else {
    self.alpha = 1.0;
}
}

-(void) setHasFocus:(BOOL)_hasFocus {
hasFocus = _hasFocus;
if(hasFocus) {
    [self startAnimation];
}
}

2 sorun) o anki animasyon döngüsünü bitirir her zaman olduğu gibi anim durduramaz gecikme olması.

Bu yardımcı olur umarım.

Cevap 08/05/2009 saat 18:03
kaynak kullanıcı

oy
0

Cevap çözümlerin hiçbiri benim için çalıştı. Bu çok hızlı (bir önceki animasyon henüz bitmiş değildi) çağrılırken ben sorunları vardı, çünkü benim konuların bu şekilde (bir doğru yolu olup olmadığını bilmiyorum?) Çözüldü. Ben ile benim istenilen animasyon geçmesi customAnim bloğu.

extension UIView
{

    func niceCustomTranstion(
        duration: CGFloat = 0.3,
        options: UIView.AnimationOptions = .transitionCrossDissolve,
        customAnim: @escaping () -> Void
        )
    {
        UIView.transition(
            with: self,
            duration: TimeInterval(duration),
            options: options,
            animations: {
                customAnim()
        },
            completion: { (finished) in
                if !finished
                {
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    self.layer.removeAllAnimations()
                    customAnim()
                }
        })

    }

}
Cevap 20/08/2019 saat 14:52
kaynak kullanıcı

oy
0

Birlikte çalıştığım zaman UIStackViewanimasyon yanında removeAllAnimations()ihtiyacım çünkü birini başlangıç için bazı değerleri ayarlamak için removeAllAnimations()öngörülemeyen durumuna ayarlayabilirsiniz. Ben stackViewile view1ve view2iç ve bir görünümü görünür olmalıdır ve bir gizli:

public func configureStackView(hideView1: Bool, hideView2: Bool) {
    let oldHideView1 = view1.isHidden
    let oldHideView2 = view2.isHidden
    view1.layer.removeAllAnimations()
    view2.layer.removeAllAnimations()
    view.layer.removeAllAnimations()
    stackView.layer.removeAllAnimations()
    // after stopping animation the values are unpredictable, so set values to old
    view1.isHidden = oldHideView1 //    <- Solution is here
    view2.isHidden = oldHideView2 //    <- Solution is here

    UIView.animate(withDuration: 0.3,
                   delay: 0.0,
                   usingSpringWithDamping: 0.9,
                   initialSpringVelocity: 1,
                   options: [],
                   animations: {
                    view1.isHidden = hideView1
                    view2.isHidden = hideView2
                    stackView.layoutIfNeeded()
    },
                   completion: nil)
}
Cevap 07/02/2019 saat 09:03
kaynak kullanıcı

oy
0

Stephen Darlington'un çözümün Swift versiyonu

UIView.beginAnimations(nil, context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(0.1)
// other animation properties

// set view properties
UIView.commitAnimations()
Cevap 26/12/2017 saat 15:09
kaynak kullanıcı

oy
0

aslı veya nihai devleti dönüştürme olmadan bir animasyon duraklatmak için:

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;
Cevap 03/12/2015 saat 21:43
kaynak kullanıcı

oy
0
CALayer * pLayer = self.layer.presentationLayer;
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView animateWithDuration:0.001 animations:^{
    self.frame = pLayer.frame;
}];
Cevap 28/01/2013 saat 15:54
kaynak kullanıcı

oy
0

Eğer animasyon Yukarıdaki şekillerde animasyonu iptal bile didStopSelectorhala çalışır. Eğer animasyonlar ile tahrik uygulamanızda mantık durumlarını varsa Yani sorun yaşayabilirsiniz. Ben bağlamı değişkeni kullanan yukarıda anlatılan yollarla bu nedenle UIViewanimasyonlar. Eğer animasyon bağlam param tarafından programın mevcut durumunu geçerseniz animasyon durduğunda didStopSelectoro şey yapmak ya da sadece mevcut durumu ve bağlamı olarak geçirilen devlet değerine dayalı dönmelidir IF_FUNCTION karar verebilir.

Cevap 05/10/2010 saat 09:52
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more