Come creare un'animazione di rimbalzo UIView?


92

Ho chiamato il seguente CATransition per un UIView finalScoreView, che lo fa entrare nella schermata dall'alto:

CATransition *animation = [CATransition animation];
animation.duration = 0.2;
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromBottom;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

[gameOver.layer addAnimation:animation forKey:@"changeTextTransition"];
[finalScoreView.layer addAnimation:animation forKey:@"changeTextTransition"];

Come faccio a farlo in modo che rimbalzi una volta dopo essere caduto e poi rimanga fermo? Dovrebbe comunque entrare nello schermo dall'alto, ma poi rimbalzare quando scende.

Qualsiasi aiuto sarebbe molto apprezzato, grazie!


3
Stai prendendo di mira iOS7 e versioni successive? Se è così, potresti sfruttare UIKit Dynamics
WDUK

Risposte:


144

Con iOS7 e UIKit Dynamics, non è più necessario utilizzare CAKeyframeAnimationso UIViewanimazioni!

Dai un'occhiata all'app UIKit Dynamics Catalog di Apple . In alternativa, Teehanlax ha un tutorial chiaro e conciso con il progetto completo in GitHub . Se desideri un tutorial più dettagliato sui dettagli della dinamica, il tutorial di Ray Winderlich è fantastico. Come sempre, i documenti di Apple sono un'ottima prima tappa, quindi controlla il riferimento alla classe UIDynamicAnimator nei documenti.

Ecco un po 'di codice dal tutorial di Teenhanlax:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UIGravityBehavior* gravityBehavior = 
                [[UIGravityBehavior alloc] initWithItems:@[self.redSquare]];
[self.animator addBehavior:gravityBehavior];

UICollisionBehavior* collisionBehavior = 
                [[UICollisionBehavior alloc] initWithItems:@[self.redSquare]]; 
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collisionBehavior];

UIDynamicItemBehavior *elasticityBehavior = 
                [[UIDynamicItemBehavior alloc] initWithItems:@[self.redSquare]];
elasticityBehavior.elasticity = 0.7f;
[self.animator addBehavior:elasticityBehavior];

Ed ecco i risultati

Rimbalzo quadrato

UIKit Dynamics è un'aggiunta davvero potente e facile da usare a iOS7 e puoi ottenere un'interfaccia utente fantastica da essa.

Altri esempi:

Rimbalzo del pulsante Rimbalzo della diapositiva Collezione Springy Raccolta sprint WWDC

I passaggi per implementare le dinamiche UIKit sono sempre gli stessi:

  1. Crea un UIDynamicAnimatore conservalo in una proprietà forte
  2. Creane uno o più UIDynamicBehaviors. Ogni comportamento dovrebbe avere uno o più elementi, in genere una vista da animare.
  3. Assicurati che lo stato iniziale degli elementi utilizzati in UIDynamicBehaviorssia uno stato valido all'interno della UIDynamicAnimatorsimulazione.

1
Ciao Michael, grazie mille per il tuo aiuto! Questo sembra decisamente estremamente facile da fare! L'ho provato e funziona quando tocca la parte inferiore della vista, ma non funziona con un'altra vista - stackoverflow.com/questions/21895674/… - Mi piacerebbe se tu potessi aiutarmi là fuori! :) Grazie
user3127576

2
UN MAGNIFICO tutorial MA useresti solo una riga di codice, usando SpringWithDamping, per un rimbalzo!
Fattie

2
Puoi condividere alcuni esempi di codice per l'animazione di rimbalzo di Uitableview come sopra. Sto provando con UITableview ma non sono sicuro da dove iniziare.
Dinesh

1
UIKit Dynamics è fantastico quando ti occupi di casi di esempio. Ma quando si tratta di compiti reali, vedi quanto sia crudo e limitato. Un grosso problema è l'override di UIDynamicItemBehavior(che in realtà sono proprietà, non comportamento). Non puoi semplicemente usare proprietà fisiche diverse in comportamenti diversi. Un altro caso è l'implementazione di limiti di gomma simili a UIScrollView: è molto complicato. Posso scrivere anche di più ma il commento è troppo breve.
kelin

2
aggiungi il codice completo per favore. Il tuo codice descrive come creare UIDynamicAnimatore gli oggetti ad esso associati ma non risponde a come usarli
Vyachaslav Gerchicov

261

Un'alternativa più semplice a UIDynamicAnimatorin iOS 7 è Spring Animation (una nuova e potente animazione a blocchi UIView), che può darti un piacevole effetto di rimbalzo con smorzamento e velocità: Obiettivo C

[UIView animateWithDuration:duration
  delay:delay
  usingSpringWithDamping:damping
  initialSpringVelocity:velocity
  options:options animations:^{
    //Animations
    }
  completion:^(BOOL finished) {
    //Completion Block
}];

Swift

UIView.animateWithDuration(duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

Swift 4.0

UIView.animate(withDuration:duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

usingSpringWithDamping 0.0 == molto rimbalzante. 1.0 lo fa decelerare dolcemente senza overshooting.

initialSpringVelocityè, approssimativamente, "distanza desiderata, divisa per secondi desiderati". 1.0 corrisponde alla distanza totale dell'animazione percorsa in un secondo. Esempio, la distanza totale dell'animazione è 200 punti e si desidera che l'inizio dell'animazione corrisponda a una velocità di visualizzazione di 100 pt / s, utilizzare un valore di 0,5.

Un tutorial più dettagliato e un'app di esempio sono disponibili in questo tutorial . Spero che questo sia utile per qualcuno.


2
Ecco un progetto demo che ho creato per aiutarti a ottenere l'animazione giusta. Godere! github.com/jstnheo/SpringDampingDemo
jstn

Grazie per quel progetto demo, amico. Aiuta davvero a capire questi valori poiché sono piuttosto ottusi. Vorrei che Apple le avesse rese più chiare
kakubei

32

Ecco un progetto demo che ho creato per aiutarti a ottenere l'animazione giusta. Godere!

SpringDampingDemo

inserisci qui la descrizione dell'immagine


Grazie per quel progetto demo, amico. Aiuta davvero a capire questi valori poiché sono piuttosto ottusi. Vorrei che Apple le avesse rese più chiare
kakubei

-1
- (IBAction)searchViewAction:(UIButton*)sender
{
  if(sender.tag == 0)
  {
    sender.tag = 1;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = -320;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;
    self.searhTopView.frame = optionsFrame;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 0;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];        
}
else
{
    sender.tag = 0;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = 0;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 320;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];
}
}

1
Non ci sono spiegazioni nel codice e nessun commento. Questo non è utile
Lorenzo
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.