Best Practice für iPhone UIView Animation

142

Was gilt als bewährte Methode zum Animieren von Ansichtsübergängen auf dem iPhone?

Das Beispielprojekt ViewTransitionsvon Apple verwendet beispielsweise Code wie:

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

Es gibt aber auch Code-Schnipsel im Netz, die so aussehen:

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

Was ist der beste Ansatz? Wenn Sie auch einen Ausschnitt bereitstellen könnten, wäre dies sehr dankbar.

HINWEIS: Ich konnte den zweiten Ansatz nicht richtig ausführen.

Keith Fitzgerald
quelle

Antworten:

118

Aus dem Abschnitt der UIView-Referenz über die beginAnimations:context:Methode:

Von der Verwendung dieser Methode wird in iPhone OS 4.0 und höher abgeraten. Sie sollten stattdessen die blockbasierten Animationsmethoden verwenden.

ZB blockbasierte Animation basierend auf Toms Kommentar

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];
Rafael Vega
quelle
4
Um klar zu sein, heißt das, den ersten Ansatz (CATransition) zu verwenden, nicht den zweiten?
Steve N
2
Ja, es ist der erste Ansatz (CATransition).
NebulaFox
16
@Steven N, nein, es bedeutet, UIViewstattdessen die blockbasierten Animationen zu verwenden. Sie sind im Wesentlichen die gleichen wie beginAnimationsund Freunde, verwenden jedoch Block- / Verschlussfunktionen.
Dan Rosenstark
36
Ja, Yar hat recht. So sieht eine [UIView transitionWithView:mysuperview duration:0.75 options:UIViewAnimationTransitionFlipFromRight animations:^{ [myview removeFromSuperview]; } completion:nil]Blockanimation aus: Weitere Informationen finden Sie in der UIView-Dokumentation.
Tom van Zummeren
3
Außer wenn Sie 3.1.3-Telefone unterstützen möchten. Dann benutze keine Blöcke.
ZaBlanc
69

Letzteres habe ich für viele schöne leichte Animationen verwendet. Sie können damit zwei Ansichten überblenden oder eine vor der anderen einblenden oder ausblenden. Sie können eine Ansicht über eine andere wie ein Banner schießen, Sie können eine Ansicht strecken oder verkleinern ... Ich bekomme eine Menge Kilometer aus beginAnimation/ commitAnimations.

Denken Sie nicht, dass Sie nur Folgendes tun können:

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

Hier ist ein Beispiel:

[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];

Wie Sie sehen können, können Sie mit Alpha, Frames und sogar Größen einer Ansicht spielen. Herumspielen. Sie können mit seinen Fähigkeiten überrascht sein.

Mahboudz
quelle
52

Der Unterschied scheint darin zu liegen, wie viel Kontrolle Sie über die Animation benötigen.

Der CATransitionAnsatz gibt Ihnen mehr Kontrolle und damit mehr Dinge einzurichten, z. die Timing-Funktion. Als Objekt können Sie es für später speichern, umgestalten, um alle Ihre Animationen darauf zu richten, um doppelten Code zu reduzieren usw.

Die UIViewKlassenmethoden sind praktische Methoden für gängige Animationen, jedoch eingeschränkter als CATransition. Zum Beispiel gibt es nur vier mögliche Übergangstypen (nach links drehen, nach rechts drehen, nach oben rollen, nach unten rollen). Wenn Sie ein Einblenden durchführen möchten, müssen Sie entweder nach unten graben, um den CATransition'sÜbergang auszublenden, oder eine explizite Animation Ihres UIViewAlphas einrichten .

Beachten Sie, dass Sie CATransitionunter Mac OS X einen beliebigen CoreImageFilter angeben können , der als Übergang verwendet werden soll. Derzeit können Sie dies jedoch nicht auf dem fehlenden iPhone tun CoreImage.

Ryan McCuaig
quelle
7
Beachten Sie, dass dies ein Ratschlag aus der iOS 2.0-Ära ist. Lesen Sie die Antwort von Rafael Vega zu blockbasierten Methoden, wenn Sie mit iOS 4.0 oder höher arbeiten.
Ryan McCuaig
Beachten Sie auch, dass CoreImage ab iOS 5 verfügbar ist, jedoch nur einige seiner Funktionen. Ich glaube, Sie können einen CoreImage-Übergang in einer Animation verwenden, aber unter iOS (5) können Sie keine benutzerdefinierten CoreImage-Filter erstellen.
Aaron Ash
26

Mit diesem einfachen Code können wir Bilder in iOS 5 animieren.

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!");
    }];
Guru
quelle
5
Dies ist auch in iOS 4 verfügbar und wird als "blockbasierte" Animation bezeichnet. Es ist nicht auf iOS 5 und höher beschränkt.
Johnbakers
8

UIViewLesen Sie in den Dokumenten diese Funktion für ios4 +

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

Jedenfalls wird die "Block" -Methode heutzutage bevorzugt. Ich werde den einfachen Block unten erklären.

Betrachten Sie die unten geschnippten. Bug2 und Bug 3 sind ImageViews. Die folgende Animation beschreibt eine Animation mit einer Dauer von 1 Sekunde nach einer Verzögerung von 1 Sekunde. Der Bug3 wird von seiner Mitte in die Mitte von Bug2 verschoben. Sobald die Animation abgeschlossen ist, wird sie als "Center Animation Done!" Protokolliert.

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

Hoffe das ist sauber !!!

Deepukjayan
quelle
2
Sie haben das CGPoint bug3.center bug3Center zugewiesen und kurz danach das CGPoint bug2.center derselben Variablen bug3Center zugewiesen? Warum machen Sie das ?
pnizzle
oopss !! das ist ein Tippfehler Freunde. Jetzt aktualisiert.
Deepukjayan
2

Hier ist Code für reibungslose Animation, könnte für viele Entwickler hilfreich sein.
Ich habe diesen Codeausschnitt aus diesem Tutorial gefunden.

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.
iPatel
quelle
2

Lassen Sie uns versuchen, für Swift 3 auszuchecken ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
Saurabh Sharma
quelle