Como criar uma animação de salto UIView?

92

Tenho a seguinte transição de CAT para um UIView chamado finalScoreView, o que o faz entrar na tela a partir do topo:

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

Como faço para que salte uma vez depois de descer e fique parado? Ele ainda deve entrar na tela pelo topo, mas depois pular quando descer.

Qualquer ajuda seria muito apreciada, obrigado!

user3127576
fonte
3
Você está visando iOS7 e superior?
Nesse

Respostas:

144

Com iOS7 e UIKit Dynamics, não há mais necessidade de usar CAKeyframeAnimationsou UIViewanimações!

Dê uma olhada no aplicativo UIKit Dynamics Catalog da Apple . Como alternativa, Teehanlax tem um tutorial claro e conciso com o projeto completo no github . Se você quiser um tutorial mais detalhado sobre os meandros da dinâmica, o tutorial de Ray Winderlich é ótimo. Como sempre, os documentos da Apple são uma ótima primeira parada, então verifique a referência da classe UIDynamicAnimator nos documentos.

Aqui está um pouco do código do tutorial do 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];

e aqui estão os resultados

Salto quadrado

UIKit Dynamics é uma adição realmente poderosa e fácil de usar para iOS7 e você pode obter uma interface de usuário de excelente aparência a partir dele.

Outros exemplos:

Salto do botão Salto do slide Coleção elástica Coleção WWDC Sprint

As etapas para implementar a dinâmica do UIKit são sempre as mesmas:

  1. Crie um UIDynamicAnimatore armazene-o em uma propriedade forte
  2. Crie um ou mais UIDynamicBehaviors. Cada comportamento deve ter um ou mais itens, normalmente uma visualização para animar.
  3. Certifique-se de que o estado inicial dos itens usados ​​no UIDynamicBehaviorsé um estado válido na UIDynamicAnimatorsimulação.
memmons
fonte
1
Oi Michael, muito obrigado por sua ajuda! Isso definitivamente parece extremamente fácil de fazer! Eu tentei e funciona quando atinge a parte inferior da visualização, mas não funciona com outra visualização - stackoverflow.com/questions/21895674/… - Eu adoraria se você pudesse me ajudar lá! :) Obrigado
user3127576 de
2
UM Tutorial MAGNÍFICO MAS você apenas usaria uma linha de código, usingSpringWithDamping, para um salto!
Fattie
2
Você pode compartilhar algum exemplo de código para a animação de salto Uitableview como acima. Estou tentando com UITableview, mas não tenho certeza por onde começar.
Jantar em
1
O UIKit Dynamics é ótimo quando você lida com casos de exemplo. Mas quando se trata de tarefas reais, você vê o quão cru e restrito é. Um grande problema é anular UIDynamicItemBehavior(que na verdade são propriedades, não comportamento). Você não pode simplesmente usar diferentes propriedades físicas em diferentes comportamentos. Outro caso é a implementação de limites de borracha do tipo UIScrollView - é muito complicado. Posso escrever ainda mais, mas o comentário é muito curto.
kelin de
2
adicione o código completo, por favor. Seu código descreve como criar UIDynamicAnimatore objetos associados a ele, mas não responde como usá-los
Vyachaslav Gerchicov
261

Uma alternativa mais simples para UIDynamicAnimatorno iOS 7 é Spring Animation (uma nova e poderosa animação em bloco UIView), que pode fornecer um bom efeito de salto com amortecimento e velocidade: Objetivo C

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

Rápido

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 == muito saltitante. 1.0 faz com que ele desacelere suavemente sem ultrapassar.

initialSpringVelocityé, aproximadamente, "distância desejada, dividida pelos segundos desejados". 1.0 corresponde à distância total da animação percorrida em um segundo. Exemplo, a distância total da animação é 200 pontos e você deseja que o início da animação corresponda a uma velocidade de visualização de 100 pt / s, use um valor de 0,5.

Um tutorial mais detalhado e um aplicativo de amostra podem ser encontrados neste tutorial . Espero que isso seja útil para alguém.

Huong
fonte
2
Aqui está um projeto de demonstração que criei para ajudá-lo a obter a animação certa. Aproveitar! github.com/jstnheo/SpringDampingDemo
jstn
Parabéns por esse projeto de demonstração, cara. Realmente ajuda a descobrir esses valores, pois eles são bastante obtusos. Gostaria que a Apple os tivesse deixado mais claros
kakubei
32

Aqui está um projeto de demonstração que criei para ajudá-lo a obter a animação certa. Aproveitar!

SpringDampingDemo

insira a descrição da imagem aqui

jstn
fonte
Parabéns por esse projeto de demonstração, cara. Realmente ajuda a descobrir esses valores, pois eles são bastante obtusos. Gostaria que a Apple os tivesse deixado mais claros
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) {
    }];
}
}
Spydy
fonte
1
Não há explicação no código e nenhum comentário. Isso não ajuda
Lorenzo