Executando o iOS Animações Em Vistas Com UIKit E a uiview
- Sobre O Autor
- animando a 60FPS
- Frameworks Core
- UIKit/UIView Animations
- animation (withDuration: animations: completion)
- animateWithDuration
- UIViewPropertyAnimator
- What Is a frame?
- animateKeyframes
- CoreAnimation
- UIView + Core Animation
- UIKitDynamics
- Uikitdynamicanimador
- UIKitDynamicBehavior
- afinação de desempenho
- Core Animation instrumento
- o desenho
- rasterização
- encerrando
Sobre O Autor
Saravanan é um iOS engenheiro e escritor Flexiple e Ferramentas Remotas. Ele já trabalhou com várias startups em diferentes domínios.Mais aboutSaravanan↬
- 14 min de leitura
- Animação,iOS,UI,Móveis
- Guardada para leitura off-line
- Compartilhar no Twitter, O LinkedIn
i tem sido um desenvolvedor do iOS há mais de uma década e raramente tem visto artigos que consolidam todas as formas possíveis de realizar animações no iOS. Este artigo pretende ser um primer sobre animações iOS com a intenção de cobrir exaustivamente as diferentes formas de fazer o mesmo.dada a extensão do tópico, nós cobraríamos cada parte de forma sucinta em um nível bastante alto. O objetivo é educar o leitor com um conjunto de escolhas para adicionar animações ao seu aplicativo iOS.
Antes de começarmos com tópicos relacionados com o iOS, vamos dar uma breve olhada na velocidade de animação.
animando a 60FPS
geralmente em vídeos, cada moldura é representada por uma imagem e a taxa de moldura determina o número de imagens invertidas na sequência. Isto é denominado como ‘frames por segundo’ ou FPS.
FPS determina o número de imagens fixas viradas dentro de um segundo, o que significa literalmente que quanto mais o número de imagens/ quadros, mais detalhes/ informações são exibidos no vídeo. Isto também se aplica às animações.
FPS é tipicamente usado para determinar a qualidade das animações. Há uma opinião popular de que qualquer boa animação deve ser executado em 60fps ou mais — qualquer coisa menos de 60fps iria se sentir um pouco fora.deseja ver a diferença entre 30FPS e 60FPS? Olha para isto!notou a diferença? Os olhos humanos podem sentir o nervosismo no fps inferior. Assim, é sempre uma boa prática para garantir que qualquer animação que você criar, adere à regra básica de correr a 60 fps ou mais. Isto faz com que se sinta mais realista e vivo.
tendo olhado para o FPS, vamos agora aprofundar os diferentes quadros principais do iOS que nos fornecem uma forma de realizar animações.
Frameworks Core
nesta secção, iremos tocar nos frameworks no SDK iOS que podem ser usados para criar animações de visualização. Faremos uma rápida caminhada através de cada um deles, explicando seu conjunto de recursos com um exemplo relevante.
UIKit/UIView Animations
UIView é a classe base para qualquer Vista que exiba conteúdo em aplicações iOS.
UIKit, o framework que nos dá o UIView, já nos fornece algumas funções básicas de animação que tornam conveniente para os desenvolvedores alcançar mais fazendo menos.
a API, UIView.animate
, é a maneira mais fácil de animar as vistas, uma vez que as propriedades de qualquer Vista podem ser facilmente animadas, fornecendo os valores da propriedade na sintaxe baseada em blocos.
nas animações do UIKit, recomenda-se modificar apenas as propriedades animáveis do UIVIew caso contrário, haverá repercussões onde as animações podem fazer com que a vista acabe num estado inesperado.
animation (withDuration: animations: completion)
este método leva na duração da animação, um conjunto de propriedades animáveis do view muda que precisam ser animados. O bloco de completação dá uma chamada de volta quando a vista é feita com a realização da animação.
quase qualquer tipo de animação como mover, escalar, rodar, desvanecer, etc. em uma visão pode ser alcançado com esta API única.
agora, considere que deseja animar uma mudança de tamanho do botão ou deseja uma vista particular para ampliar o ecrã. É assim que podemos fazê-lo usando o UIView.animate
API:
let newButtonWidth: CGFloat = 60UIView.animate(withDuration: 2.0) { //1 self.button.frame = CGRect(x: 0, y: 0, width: newButtonWidth, height: newButtonWidth) //2 self.button.center = self.view.center //3}
Aqui está o que estamos fazendo aqui:
- chamamos de
UIView.animate
método com um valor de duração passado para ele, que representa quanto tempo a animação, descrito dentro do bloco, deve ser executado. - definimos a nova moldura do botão que deve representar o estado final da animação.
- nós definimos o botão
center
com o centro de seu superview para que ele permaneça no centro da tela.
O bloco acima de animação código deve acionar a animação do botão do quadro de mudança do quadro atual:
Width = 0, Height = 0
Para o último frame:
Width = Height = newButtonWidth
E aqui está o que a animação ficaria como:
animateWithDuration
Este método é uma extensão do anime método onde você pode fazer tudo o que você pode executar na prévia API com alguns física comportamentos adicionado à exibição de animações.
Por exemplo, se você deseja alcançar mola de amortecimento efeitos na animação que fizemos acima, então esta é a forma como o código ficaria assim:
let newButtonWidth: CGFloat = 60UIView.animate(withDuration: 1.0, //1 delay: 0.0, //2 usingSpringWithDamping: 0.3, //3 initialSpringVelocity: 1, //4 options: UIView.AnimationOptions.curveEaseInOut, //5 animations: ({ //6 self.button.frame = CGRect(x: 0, y: 0, width: newButtonWidth, height: newButtonWidth) self.button.center = self.view.center}), completion: nil)
Aqui está o conjunto de parâmetros utilizados:
-
duration
representa a duração da animação determinando quanto tempo o bloco de código deve ser executado. - representa o atraso inicial que queremos ter antes do início da animação.
- representa o valor do efeito springy que queremos que a vista se comporte. O valor deve estar entre 0 e 1. Quanto menor o valor, maior a oscilação da mola.
velocity
representa a velocidade a que a animação deve começar.options
Tipo de curva de animação que deseja aplicar à sua animação visual.- finalmente, o bloco de código onde definimos a moldura do botão que precisa ser animado. É o mesmo que a animação anterior.
E aqui está como a animação seria com a configuração de animação acima:
UIViewPropertyAnimator
Por um pouco mais de controle sobre animações, UIViewPropertyAnimator
vem a calhar, onde ele nos fornece um caminho para pausar e retomar animações. Você pode ter o timing personalizado e ter a sua animação para ser interativo e interruptível. Isso é muito útil ao realizar animações que também são interactáveis com as ações do Usuário.
O clássico ‘Slide to Unlock’ gesto e a vista do jogador descartar / expandir a animação (na aplicação de música) são exemplos de animações interativas e interruptíveis. Você pode começar a mover uma vista com o seu dedo, em seguida, liberá-lo e a vista irá voltar para a sua posição original. Alternativamente, você pode pegar a vista durante a animação e continuar arrastando-a com o dedo.
a Seguir está um exemplo simples de como podemos alcançar a animação usando UIViewPropertyAnimator
:
let newButtonWidth: CGFloat = 60let animator = UIViewPropertyAnimator(duration:0.3, curve: .linear) { //1 self.button.frame = CGRect(x: 0, y: 0, width: newButtonWidth, height: newButtonWidth) self.button.center = self.view.center}animator.startAnimation() //2
Aqui está o que estamos fazendo:
- chamamos o
UIViewProperty
API passando a duração e a curva de animação. - Ao contrário de ambos os UIView acima.animar API ‘ s, a animação não vai começar a menos que você mesmo especificá-lo, ou seja, você está no controle total do processo de animação/ fluxo completo.agora, vamos dizer que você quer ainda mais controle sobre as animações. Por exemplo, você quer projetar e controlar cada frame na animação. Há outra API para isso,
animateKeyframes
. Mas antes de nos debruçarmos sobre isso, vamos ver rapidamente o que é uma moldura, em uma animação.
What Is a
frame
?uma coleção de mudanças/ transições de quadros da vista, do estado inicial ao estado final, é definida como
animation
e cada posição da vista durante a animação é chamada como umframe
.animateKeyframes
Esta API fornece uma forma de desenhar a animação de tal forma que você pode definir várias animações com diferentes timings e transições. Post this, the API simply integrates all the animations into one seamless experience.digamos que queremos mover o nosso botão na tela de forma aleatória. Vamos ver como podemos usar a API de animação keyframe para fazê-lo.
UIView.animateKeyframes(withDuration: 5, //1 delay: 0, //2 options: .calculationModeLinear, //3 animations: { //4 UIView.addKeyframe( //5 withRelativeStartTime: 0.25, //6 relativeDuration: 0.25) { //7 self.button.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.maxY) //8 } UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.25) { self.button.center = CGPoint(x: self.view.bounds.width, y: start.y) } UIView.addKeyframe(withRelativeStartTime: 0.75, relativeDuration: 0.25) { self.button.center = start }})
Aqui está a discriminação:
-
duration
Call the API by passing in the duration of the animation. - atraso inicial duração da animação.
options
O tipo de curva de animação que deseja aplicar à sua animação visual.animations
bloco que leva todas as animações de chaves projetadas pelo desenvolvedor / usuário.addKeyFrame
Call the API to design each and every animation. No nosso caso, definimos cada movimento do botão. Podemos ter tantas animações quantas precisarmos, adicionadas ao bloco.relativeStartTime
define a hora de início da animação na coleção do bloco de animação.relativeDuration
define a duração global desta animação específica.-
center
no nosso caso, simplesmente mudamos a propriedade central do botão para mover o botão em torno da tela.
E este é o aspecto final animações parece:
CoreAnimation
Qualquer UIKit com base animação internamente é traduzido para o núcleo de animações. Assim, a estrutura de animação principal atua como uma camada de suporte ou espinha dorsal para qualquer animação UIKit. Assim, todas as APIs de animação UIKit são apenas camadas encapsuladas da APIs de animação principal de uma forma facilmente consumível ou conveniente.
UIKit animation APIs não fornecem muito controle sobre as animações que foram realizadas sobre uma vista, uma vez que eles são usados principalmente para propriedades animáveis da vista. Assim, nesses casos, onde você pretende ter controle sobre cada quadro da animação, é melhor usar a APIs de animação Central subjacente diretamente. Alternativamente, tanto as animações UIView e núcleo de animações podem ser usados em conjunto também.
UIView + Core Animation
Let’s see how we can recreate the same button change animation along with specifying the timing curve using the UIView and Core Animation APIs.
Podemos usar
CATransaction
‘s funções de timing, que lhe permite especificar e controlar a curva de animação.Let’s look at an example of a button size change animation with its corner radius utilizing the
CATransaction
‘s timing function and a combination of UIView animations:let oldValue = button.frame.width/2let newButtonWidth: CGFloat = 60/* Do Animations */CATransaction.begin() //1CATransaction.setAnimationDuration(2.0) //2CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)) //3// View animations //4UIView.animate(withDuration: 1.0) { self.button.frame = CGRect(x: 0, y: 0, width: newButtonWidth, height: newButtonWidth) self.button.center = self.view.center}// Layer animationslet cornerAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.cornerRadius)) //5cornerAnimation.fromValue = oldValue //6cornerAnimation.toValue = newButtonWidth/2 //7button.layer.cornerRadius = newButtonWidth/2 //8button.layer.add(cornerAnimation, forKey: #keyPath(CALayer.cornerRadius)) //9CATransaction.commit() //10
:
begin
representa o início do bloco de código de animação.duration
duração total da animação.curve
representa a curva de tempo que precisa ser aplicada à animação.UIView.animate
nossa primeira animação a mudar a moldura do botão.-
CABasicAnimation
Nós criamos oCABasicAnimation
objeto consultando ocornerRadius
do botão como o caminho-chave, desde que é o que deseja animar. Da mesma forma, se você quiser ter o controle de nível granular sobre as animações do keyframe, então você pode usar a classeCAKeyframeAnimation
.
-
-
fromValue
Representa o valor inicial da animação, i.e. inicialcornerRadius
valor do botão de onde a animação deve iniciar. -
toValue
Representa o valor final da animação, i.e. o finalcornerRadius
valor do botão, onde a animação deve acabar. -
cornerRadius
Temos de definir ocornerRadius
propriedade do botão com o valor final da animação mais o botão de cornerRadius valor vai começar auto-revertido para o valor inicial após a animação completa. addAnimation
nós anexamos o objeto de animação que contém a configuração de todo o processo de animação à camada, representando o teclado para o qual a animação precisa ser realizada.commit
representa o fim do bloco de código de animação e inicia a animação.
Esta é a forma como a animação final ficaria assim:
Este blog é uma ótima leitura para ajudar a criar mais animações avançadas, como é perfeitamente orienta o Núcleo de Animação quadro APIs com instruções para guiá-lo através de cada passo do caminho.
UIKitDynamics
UIKit Dynamics é o motor de física para o UIKit que permite que você adicione qualquer de física de comportamentos como a colisão, gravidade, empurrar, snap, etc., para o UIKit controles.
Uikitdynamicanimador
esta é a classe de administração da estrutura dinâmica UIKit que regula todas as animações desencadeadas por qualquer controle de IU dado.
UIKitDynamicBehavior
permite adicionar qualquer comportamento físico a um animador que, em seguida, lhe permite realizar na vista associada a ele.diferentes tipos de comportamentos para a Uikitdinâmica incluem::
UIAttachmentBehavior
UICollisionBehavior
UIFieldBehavior
UIGravityBehavior
UIPushBehavior
UISnapBehavior
A arquitetura de UIKitDynamics parece algo assim. Note que os itens 1 a 5 podem ser substituídos por uma única vista.vamos aplicar algum comportamento físico ao nosso botão. Veremos como aplicar a gravidade ao botão para que nos dê a sensação de lidar com um objeto real.
var dynamicAnimator : UIDynamicAnimator!var gravityBehavior : UIGravityBehavior!dynamicAnimator = UIDynamicAnimator(referenceView: self.view) //1gravityBehavior = UIGravityBehavior(items: ) //2dynamicAnimator.addBehavior(gravityBehavior) //3
:
UIKitDynamicAnimator
nós criamos um objetoUIKitDynamicAnimator
que atua como um orquestrador para a realização de animações. Nós também passamos o superview do nosso botão como a vista de referência.UIGravityBehavior
nós criamos umUIGravityBehavior
objeto e passar nosso botão para os elementos array nos quais este comportamento é injetado.addBehavior
We have added the gravity object to the animator.
Isto deve criar uma animação como mostrado abaixo:
-
UICollisionBehavior
temos criado de umaUICollisionBehavior
objeto e passaram ao longo do botão para que o comportamento é adicionado ao elemento. translatesReferenceBoundsIntoBoundary
habilitando esta propriedade diz ao animador para tomar o limite de vistas de referência como o fim, que é o fundo da tela em nosso caso.addBehavior
nós adicionamos comportamento de colisão ao animador aqui.