iPhone UIView Animazione Best Practice

voti
140

Qual è la cosa migliore prassi considerata per animare le transizioni vista su iPhone?

Ad esempio, il ViewTransitionsprogetto di esempio da Apple utilizza il 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 galleggiano intorno alla rete che assomigliano a questo:

[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 si potrebbe fornire un frammento così che sarebbe molto apprezzato.

NOTA: Sono stato in grado di ottenere il secondo approccio per funzionare correttamente.

È pubblicato 10/03/2009 alle 14:52
fonte dall'utente
In altre lingue...                            


9 risposte

voti
117

Dal riferimento UIView sezione 's circa il beginAnimations:context:metodo di:

L'utilizzo di questo metodo è sconsigliato in iPhone OS 4.0 e versioni successive. Si consiglia di utilizzare invece i metodi di animazione basati su blocchi.

Ad esempio di animazione basata su blocchi sulla base di un commento di Tom

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];
Risposto il 09/08/2010 a 16:02
fonte dall'utente

voti
69

Sono stato con quest'ultimo per un sacco di belle animazioni leggeri. Si può usare dissolvenza incrociata due punti di vista, o fade uno in fronte a un altro, o fade out. È possibile scattare una vista su un altro come una bandiera, si può fare un tratto di vista o ridurre ... sto ricevendo un sacco di chilometraggio fuori beginAnimation/ commitAnimations.

Non pensate che tutto quello che puoi fare è:

[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 si può vedere, si può giocare con alfa, cornici, e anche le dimensioni di una vista. Divertirsi. Si può essere sorpresi con le sue capacità.

Risposto il 04/05/2009 a 09:22
fonte dall'utente

voti
52

La differenza sembra essere la quantità di controllo è necessario sopra l'animazione.

L' CATransitionapproccio offre un maggiore controllo e quindi più cose da configurare, ad esempio. la funzione di temporizzazione. Essendo un oggetto, è possibile memorizzare per più tardi, refactoring per puntare tutte le animazioni a esso per ridurre codice duplicato, ecc

I UIViewmetodi della classe sono metodi di convenienza per le animazioni comuni, ma sono più limitate rispetto CATransition. Ad esempio, ci sono solo quattro tipi possibili di transizione (flip sinistra, flip destra, rannicchiarsi, arricciare il basso). Se si voleva fare un fade in, dovreste o scavare fino a CATransition'ssvanire di transizione, o di impostare un'animazione esplicita del UIView's alpha.

Si noti che CATransitionsu Mac OS X permette di specificare un arbitrario CoreImagefiltro da utilizzare come una transizione, ma così com'è ora non si può fare questo su iPhone, che manca CoreImage.

Risposto il 10/03/2009 a 16:24
fonte dall'utente

voti
26

Siamo in grado di animare le immagini in iOS 5 con 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!");
    }];
Risposto il 20/01/2012 a 10:10
fonte dall'utente

voti
8

Nei UIViewdocumenti, hanno un letto su questa funzione per iOS4 +

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
Risposto il 11/10/2011 a 11:19
fonte dall'utente

voti
6

In ogni caso il metodo "Block" è preffered ora a un giorno. Spiegherò il blocco semplice qui sotto.

Si consideri il stato tagliato in basso. bug2 e bug 3 sono imageViews. L'animazione seguente descrive un'animazione con 1 secondi di durata dopo un ritardo di 1 secondo. Il bug3 viene spostato dal suo centro al centro di bug2. Una volta che l'animazione è completato sarà registrata "Centro Animazione Fatto!".

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

Speranza che è pulito !!!

Risposto il 08/03/2012 a 05:12
fonte dall'utente

voti
4

Ho trovato un buon tutorial in questo link. Spero che questo sarà utile per qualcuno.

UIView-animation dimostrativi

Risposto il 05/10/2012 a 08:08
fonte dall'utente

voti
2

Ecco il codice per l'animazione liscio, 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.
Risposto il 03/07/2013 a 08:19
fonte dall'utente

voti
1

Facciamo cercare di Checkout per Swift 3 ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
Risposto il 15/03/2017 a 12:50
fonte dall'utente

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