Mégsem UIView animáció?

szavazat
221

Lehetséges, hogy megszünteti a UIViewanimáció közben folyamatban van? Vagy azt kell dobni a CA szinten?

azaz tettem valami ehhez hasonlót (talán beállítás véget animációs akció is):

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

// set view properties

[UIView commitAnimations];

De mielőtt az animáció befejeződött, és kapok az animáció véget ért rendezvény, szeretnék törölni (rövidre). Van erre lehetőség? Googling körül találja néhány ember azt kérdezi ugyanazt a kérdést nem választ - és egy vagy két ember elmélkedett, hogy nem lehet megtenni.

A kérdést 17/02/2009 00:19
a forrás felhasználó
Más nyelveken...                            


17 válasz

szavazat
342

Használat:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
Válaszolt 19/03/2010 07:53
a forrás felhasználó

szavazat
111

Én úgy csinálni, hogy hozzon létre egy új animáció a végpontot. Meg egy nagyon rövid ideig, és győződjön meg róla, hogy használja a +setAnimationBeginsFromCurrentState:módszert, hogy indul a jelenlegi állapot. Ha meg azt, hogy IGEN, a jelenlegi animáció rövidre. Valahogy így néz ki:

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

// set view properties

[UIView commitAnimations];
Válaszolt 08/05/2009 22:46
a forrás felhasználó

szavazat
61

Legegyszerűbb módja, hogy állítsa le az összes animációkat, különös tekintettel, azonnal , az a következő:

Kapcsolja össze a projektet QuartzCore.framework. Elején a kódot:

#import <QuartzCore/QuartzCore.h>

Most, ha azt szeretné, hogy hagyja abba az animációk egy néző meghalt a zeneszámokat, mondjuk így:

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

A középső sor fog működni minden magától, de van egy késés, amíg a runloop lezárásának (az „átrajzolja pillanat”). Annak megakadályozása érdekében, hogy a késedelem, csomagolja a parancsot explicit tranzakciós blokk látható. Ez alkotásoknak nincs más változtatásokat hajtottak végre ez a réteg a jelenlegi runloop.

Válaszolt 04/01/2012 00:03
a forrás felhasználó

szavazat
43

Az iOS 4 vagy újabb verzió, használja a UIViewAnimationOptionBeginFromCurrentStatelehetőséget, a második animációs vágni az első animációs rövid.

Példaként tételezzük fel, hogy a néző egy tevékenység mutatója. Azt kívánod, hogy elhalványul a tevékenység mutatója, míg néhány esetleg időigényes tevékenység megkezdése és fakulnak ki, ha a tevékenység befejezése után. Az alábbi kódot, véli az aktivitás jelző hívják 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;
                     }
                 }];
}
Válaszolt 11/08/2011 09:30
a forrás felhasználó

szavazat
39

Törléséhez animáció akkor egyszerűen kell beállítani, hogy az ingatlan jelenleg animált kívül a UIView animáció. Hogy meg fog állni az animáció, ahol van, és a UIView ugrik a beállítást csak megadott.

Válaszolt 19/06/2010 18:09
a forrás felhasználó

szavazat
9

Ha animátori kényszer más állandó kilátás helyett tulajdonság sem a más módszerek működnek iOS 8.

Példa animáció:

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) {

                 }];

Megoldás:

El kell távolítani az animációk a rétegek bármely nézet, hogy ez érintené a korlátozás változás és azok sorolva.

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}
Válaszolt 07/11/2014 17:21
a forrás felhasználó

szavazat
8

Sajnáljuk feltámasztani ezt a választ, de az iOS 10 dolog kicsit megváltozott, és most megszüntetésével lehetséges, és akkor még törölni kecsesen!

Miután iOS 10 törölheti animációk UIViewPropertyAnimator !

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

Ha true az törli az animáció és megáll ott, ahol megszakította. A befejezés módszer nem nevezhető. Azonban, ha át hamis Ön felelős befejező animáció:

animator.finishAnimation(.start)

Ön tudja befejezni az animációt, és marad a jelenlegi állapot (.current), vagy menjen a kezdeti állapot (.start), vagy a végállapot (.end)

By the way, akkor is szüneteltetheti és újraindíthatja később ...

animator.pauseAnimation()
animator.startAnimation()

Megjegyzés: Ha nem szeretné, hirtelen visszavonása megfordíthatja az animáció, vagy akár módosíthatja az animáció után szünetelteti!

Válaszolt 09/11/2017 17:57
a forrás felhasználó

szavazat
7

Ha csak azt, hogy szüneteltesse / stop animáció simán

self.yourView.layer.speed = 0;

Forrás: Hogyan szüneteltetni az animációt egy réteg fa

Válaszolt 29/06/2015 11:02
a forrás felhasználó

szavazat
5
[UIView setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];
Válaszolt 06/02/2015 05:30
a forrás felhasználó

szavazat
5

A fentiek egyike sem oldotta meg nekem, de ez segített: A UIViewanimáció meghatározza az ingatlan azonnal, akkor animál is. Megállítja az animáció, amikor a prezentációs réteg megegyezik azzal a modellel (a beállított tulajdonság).

Oldottam meg a problémát, ami „Azt szeretnénk, hogy animálni, ahonnan nézel ki, mint jelenik meg” ( „Ön” jelenti azt a nézetet). Ha azt szeretnénk, hogy akkor:

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

állítsa be a helyzetben, hogy a megjelenítési réteg

ÉN használ egy pár lehetőséget, beleértve UIViewAnimationOptionOverrideInheritedDuration

De mivel az Apple dokumentáció homályos, nem tudom, hogy valóban felülírja az egyéb animációk használata esetén, vagy akkor visszaállítja időzítő.

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

És hogy legyen egy tisztességes megoldás most.

Válaszolt 16/08/2011 18:21
a forrás felhasználó

szavazat
1

Ugyanaz a problémám; Az API-k nem kell semmit, hogy megszünteti néhány konkrét animáció. A

+ (void)setAnimationsEnabled:(BOOL)enabled

letiltja az animációk, és így nem működik nekem. Van két megoldás van:

1) hogy az animált objektum egy subview. Aztán, ha szeretné törölni az animációk az adott nézet, távolítsa el azt a nézetet, vagy elrejteni. Nagyon egyszerű, de meg kell, hogy újra a subview nélkül animációk, ha meg kell tartani szem előtt.

2) ismételje meg a anim csak egy, és egy küldöttet választó újraindítani a anim ha szükséges, mint ez:

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

Probléma 2), hogy mindig van késlelteti leállítása anim ahogy befejezi az aktuális animációs ciklust.

Remélem ez segít.

Válaszolt 08/05/2009 18:03
a forrás felhasználó

szavazat
0

Egyik válaszol megoldásokat dolgozott nekem. Azt megoldotta a kérdést ilyen módon (nem tudom, ha ez a helyes út?), Mert nem volt probléma, ha hív ez túl gyors (ha az előző animáció még nem volt kész). Elmegyek én körözött animáció customAnim blokk.

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

    }

}
Válaszolt 20/08/2019 14:52
a forrás felhasználó

szavazat
0

Amikor dolgozom UIStackViewanimáció mellett removeAllAnimations()azt kell adnunk néhány értéket a kezdeti egy, mert removeAllAnimations()lehet állítani őket, hogy kiszámíthatatlan állapotba. Van stackViewa view1és view2belül, és egy nézet legyen látható és egy rejtett:

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)
}
Válaszolt 07/02/2019 09:03
a forrás felhasználó

szavazat
0

Swift változata Stephen Darlington megoldás

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

// set view properties
UIView.commitAnimations()
Válaszolt 26/12/2017 15:09
a forrás felhasználó

szavazat
0

Szüneteltetéséhez animáció nélkül visszatér állapotban eredeti vagy végleges:

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;
Válaszolt 03/12/2015 21:43
a forrás felhasználó

szavazat
0
CALayer * pLayer = self.layer.presentationLayer;
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView animateWithDuration:0.001 animations:^{
    self.frame = pLayer.frame;
}];
Válaszolt 28/01/2013 15:54
a forrás felhasználó

szavazat
0

Még ha törli az animáció a szempontból a fenti animációt didStopSelectoris fut. Tehát, ha van logikai állapotokat az alkalmazás által vezérelt animációk lesz probléma. Emiatt a fent leírt módon használni az összefüggésben változó UIViewanimációk. Ha át a jelenlegi állapotában a program által keretében param, hogy az animációt, ha az animáció megáll a didStopSelectorfunkció dönti el, hogy kell csinálni valamit, vagy csak vissza az aktuális állapot és az állam átadott érték összefüggésben.

Válaszolt 05/10/2010 09:52
a forrás felhasználó

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