Best practice per l'animazione di UIView per iPhone


142

Quali sono le best practice considerate per animare le transizioni di visualizzazione su iPhone?

Ad esempio, il ViewTransitionsprogetto di esempio di Apple utilizza un codice come:

CATransition *applicationLoadViewIn = [CATransition animation];
[applicationLoadViewIn setDuration:1];
[applicationLoadViewIn setType:kCATransitionReveal];
[applicationLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[[myview layer] addAnimation:applicationLoadViewIn forKey:kCATransitionReveal];

ma ci sono anche frammenti di codice che fluttuano attorno alla rete in questo modo:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];
[myview removeFromSuperview];
[UIView commitAnimations];

Qual è l'approccio migliore? Se anche tu potessi fornire uno snippet, sarebbe molto apprezzato.

NOTA: non sono riuscito a far funzionare correttamente il secondo approccio.

Risposte:


118

Dalla sezione di riferimento di UIView sul beginAnimations:context:metodo:

L'uso di questo metodo è sconsigliato in iPhone OS 4.0 e versioni successive. In alternativa, è necessario utilizzare i metodi di animazione basati su blocchi.

Ad esempio di animazione basata su blocchi basata sul commento di Tom

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];

4
Quindi ... per essere chiari, questo significa usare il primo approccio (CATransition), non il secondo?
Steve N,

2
Sì, è il primo approccio (CATransition).
NebulaFox,

16
@Steven N, no, significa invece utilizzare le animazioni basate su blocchi UIView. Sono essenzialmente gli stessi beginAnimationse gli amici, ma usano le funzioni di blocco / chiusura.
Dan Rosenstark,

36
Sì, Yar ha ragione. Ecco come appare un'animazione a blocchi: [UIView transitionWithView:mysuperview duration:0.75 options:UIViewAnimationTransitionFlipFromRight animations:^{ [myview removeFromSuperview]; } completion:nil]controlla la documentazione di UIView per i dettagli.
Tom van Zummeren,

3
Tranne se si desidera supportare telefoni 3.1.3. Quindi non usare i blocchi.
ZaBlanc,

69

Ho usato quest'ultimo per molte animazioni leggere e leggere. Puoi usarlo con dissolvenza incrociata di due viste, oppure dissolverne uno di fronte a un altro o sfumarlo. Puoi girare una vista su un'altra come uno striscione, puoi allungare o restringere una vista ... Sto ottenendo un sacco di chilometraggio da beginAnimation/ commitAnimations.

Non pensare che tutto ciò che puoi fare sia:

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];

Ecco un esempio:

[UIView beginAnimations:nil context:NULL]; {
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    if (movingViewIn) {
// after the animation is over, call afterAnimationProceedWithGame
//  to start the game
        [UIView setAnimationDidStopSelector:@selector(afterAnimationProceedWithGame)];

//      [UIView setAnimationRepeatCount:5.0]; // don't forget you can repeat an animation
//      [UIView setAnimationDelay:0.50];
//      [UIView setAnimationRepeatAutoreverses:YES];

        gameView.alpha = 1.0;
        topGameView.alpha = 1.0;
        viewrect1.origin.y = selfrect.size.height - (viewrect1.size.height);
        viewrect2.origin.y = -20;

        topGameView.alpha = 1.0;
    }
    else {
    // call putBackStatusBar after animation to restore the state after this animation
        [UIView setAnimationDidStopSelector:@selector(putBackStatusBar)];
        gameView.alpha = 0.0;
        topGameView.alpha = 0.0;
    }
    [gameView setFrame:viewrect1];
    [topGameView setFrame:viewrect2];

} [UIView commitAnimations];

Come puoi vedere, puoi giocare con alfa, cornici e persino dimensioni di una vista. Divertirsi. Potresti essere sorpreso dalle sue capacità.


52

La differenza sembra essere la quantità di controllo di cui hai bisogno sull'animazione.

L' CATransitionapproccio ti dà più controllo e quindi più cose da impostare, ad es. la funzione di temporizzazione. Essendo un oggetto, puoi memorizzarlo per dopo, refactor per puntare tutte le tue animazioni su di esso per ridurre il codice duplicato, ecc.

I UIViewmetodi di classe sono metodi convenienti per animazioni comuni, ma sono più limitati di CATransition. Ad esempio, ci sono solo quattro possibili tipi di transizione (capovolgi a sinistra, capovolgi a destra, rannicchiarsi, rannicchiarsi). Se vuoi fare una dissolvenza in apertura, dovresti scavare per CATransition'sdissolvere la transizione o impostare un'animazione esplicita della tua UIViewalfa.

Nota che CATransitionsu Mac OS X ti consentirà di specificare un CoreImagefiltro arbitrario da utilizzare come transizione, ma allo stato attuale non puoi farlo su iPhone, che manca CoreImage.


7
Nota che questo è un consiglio sull'era di iOS 2.0. Vedi la risposta di Rafael Vega sui metodi basati su blocchi se utilizzi iOS 4.0 o versioni successive.
Ryan McCuaig,

Inoltre, CoreImage è ora disponibile a partire da iOS 5, ma solo alcune delle sue funzionalità. Credo che tu possa usare una transizione CoreImage in un'animazione, ma non puoi creare filtri CoreImage personalizzati su iOS (5).
Aaron Ash,

26

Possiamo animare le immagini in iOS 5 usando questo semplice codice.

CGRect imageFrame = imageView.frame;
imageFrame.origin.y = self.view.bounds.size.height;

[UIView animateWithDuration:0.5
    delay:1.0
    options: UIViewAnimationCurveEaseOut
    animations:^{
        imageView.frame = imageFrame;
    } 
    completion:^(BOOL finished){
        NSLog(@"Done!");
    }];

5
questo è disponibile anche in iOS 4 ed è indicato come un'animazione "a blocchi". Non è limitato a iOS 5 e versioni successive.
johnbakers,

8

Nei UIViewdocumenti, leggi questa funzione per ios4 +

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

6

Ad ogni modo il metodo "Block" è preferito oggi. Spiegherò il semplice blocco qui sotto.

Considera lo snipped di seguito. bug2 e bug 3 sono imageViews. L'animazione di seguito descrive un'animazione della durata di 1 secondo dopo un ritardo di 1 secondo. Il bug3 viene spostato dal suo centro al centro del bug2. Una volta completata, l'animazione verrà registrata "Center Animation Done!".

-(void)centerAnimation:(id)sender
{
NSLog(@"Center animation triggered!");
CGPoint bug2Center = bug2.center;

[UIView animateWithDuration:1
                      delay:1.0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     bug3.center = bug2Center;
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Center Animation Done!");
                 }];
}

Spero sia pulito !!!


2
hai assegnato CGPoint bug3.center a bug3Center e subito dopo hai assegnato CGPoint bug2.center alla stessa variabile bug3Center? Perché lo stai facendo ?
pnizzle

oopss !! questo è un errore di battitura amici. Aggiornato ora.
Deepukjayan,

2

Ecco il codice per l'animazione fluida, potrebbe essere utile per molti sviluppatori.
Ho trovato questo frammento di codice da questo tutorial.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setAutoreverses:YES];
[animation setFromValue:[NSNumber numberWithFloat:1.3f]];
[animation setToValue:[NSNumber numberWithFloat:1.f]];
[animation setDuration:2.f];
[animation setRemovedOnCompletion:NO];

[animation setFillMode:kCAFillModeForwards];
[[self.myView layer] addAnimation:animation forKey:@"scale"];/// add here any Controller that you want t put Smooth animation.

2

proviamo a fare il checkout per Swift 3 ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.