iPhone UIView Animation Cele mai bune practici

voturi
140

Care este cea mai bună practică luate în considerare pentru animarea vedere tranzițiile de pe iPhone?

De exemplu, ViewTransitionsproiectul de probă de la Apple folosește cod cum ar fi:

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

dar există, de asemenea, fragmente de cod care plutesc în jurul net care arata asa:

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

Care este cea mai bună abordare? Dacă ați putea oferi un fragment cât de bine ar fi mult mai apreciat.

NOTĂ: Am fost în imposibilitatea de a obține a doua abordare pentru a funcționa corect.

Întrebat 10/03/2009 la 14:52
sursa de către utilizator
În alte limbi...                            


9 răspunsuri

voturi
117

Din UIView de referință secțiunea lui despre beginAnimations:context:metoda:

Utilizarea acestei metode este descurajată în iPhone OS 4.0 și mai târziu. Ar trebui să utilizați pe bază de bloc metode de animație în loc.

De exemplu, de bloc pe bază de animație bazat pe Nota lui Tom

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];
Publicat 09/08/2010 la 16:02
sursa de către utilizator

voturi
69

Am fost folosind acesta din urmă pentru o mulțime de animații ușoare frumos. Îl puteți folosi crossfade două puncte de vedere, sau se estompeze una în fața alteia, sau se estompeze - l. Puteți trage o imagine peste alta ca un banner, puteți face o porțiune de vedere sau psihiatru ... Am o mulțime de kilometraj de beginAnimation/ commitAnimations.

Să nu crezi că tot ce poți face este:

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

Iată o mostră:

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

După cum puteți vedea, puteți juca cu alfa, rame, și dimensiuni chiar de vedere. Joacă în jurul. Ați putea fi surprins cu capacitățile sale.

Publicat 04/05/2009 la 09:22
sursa de către utilizator

voturi
52

Diferența pare a fi gradul de control care aveți nevoie peste animație.

CATransitionAbordare vă oferă mai mult control și , prin urmare , mai multe lucruri pentru a configura, de ex. funcția de sincronizare. Fiind un obiect, îl puteți stoca pentru mai târziu, la punctul refactor toate animațiile la ea pentru a reduce codul duplicat, etc.

Cele UIViewmetode de clasă sunt metode de conveniență pentru animații comune, dar sunt mai limitate decât CATransition. De exemplu, există doar patru tipuri posibile de tranziție (flip - dreapta la stânga, flip, ghemuiesc, curbați în jos). Dacă ai vrut să faci o fade, ar trebui să fie sape în jos pentru a se CATransition'sestompeze de tranziție, sau creat o animație explicită a ta UIViewe alfa.

Rețineți că , CATransitionpe Mac OS X vă va permite să specificați un arbitrar CoreImagefiltru pentru a utiliza ca o tranziție, dar cum stă acum nu se poate face acest lucru pe iPhone, care îi lipsește CoreImage.

Publicat 10/03/2009 la 16:24
sursa de către utilizator

voturi
26

Putem anima imagini din iOS 5 folosind acest cod simplu.

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!");
    }];
Publicat 20/01/2012 la 10:10
sursa de către utilizator

voturi
8

În UIViewdocs, au o citit despre această funcție pentru iOS4

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
Publicat 11/10/2011 la 11:19
sursa de către utilizator

voturi
6

Oricum metoda „Block“ este acum o preferat zile. Voi explica blocul simplu de mai jos.

Luați în considerare ciuntit de mai jos. bug2 și bug-3 sunt imageViews. Animația de mai jos descrie o animație cu durata de 1 secundă, după o întârziere de 1 secundă. Bug3 este mutat de la centrul său la centrul bug2 lui. Odată ce animația este completat acesta va fi conectat „Centrul de Animație 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!");
                 }];
}

Sper că e curat !!!

Publicat 08/03/2012 la 05:12
sursa de către utilizator

voturi
4

Am găsit un tutorial bun în acest link. Sper că acest lucru va fi de ajutor pentru unii unul.

UIView-animație-tutorial

Publicat 05/10/2012 la 08:08
sursa de către utilizator

voturi
2

Aici este codul pentru animatie buna, ar putea fi de ajutor pentru mulți dezvoltatori.
Am găsit acest fragment de cod din acest 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.
Publicat 03/07/2013 la 08:19
sursa de către utilizator

voturi
1

Să nu încercați și Checkout pentru Swift 3 ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
Publicat 15/03/2017 la 12:50
sursa de către utilizator

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