Se você está lendo isso, significa que está pronto para adicionar um pouco de mágica extra aos seus aplicativos iOS. Chegou a hora de colocar uma pitada daqueles pequenos detalhes que darão ao seu aplicativo uma vantagem e farão seus usuários derramarem lágrimas de alegria quando o virem, porque ele é super mega bonito.

Salt bae meme gif

Chegou a hora de colocar uma pitada de algumas animações em Lottie em seus aplicativos iOS.

Aí você pergunta: e como eu faço isso? Bem, há muitas maneiras, é claro, mas a que vamos ver aqui é o Lottie.

O que abordaremos neste artigo

No final deste artigo, você entenderá e poderá criar seu próprio aplicativo iOS com animações em Lottie personalizadas. E aqui está o que estamos construindo juntos:

A mobile mockup playing Lottie animations

O que é Lottie?

Um Lottie é um formato de arquivo de animação baseado em JSON que permite que os designers enviem animações para qualquer plataforma com a mesma facilidade com que enviam ativos estáticos. Você pode ler mais sobre isso aqui.

Ok, estou pronto! Como começo?

Ótimo, vamos começar abrindo o Xcode e criando um novo projeto iOS.

1. Abra o Xcode, selecione “Create new Xcode project”
2. Selecione iOS e, em seguida, “Single View App”

Choose a new template in XCode
  1. Adicione o nome do projeto, a organização e o identificador. Selecione Swift e Storyboard. Toque em Next e em Create.
Give your project a name

Maravilha! Temos o projeto pronto, agora vamos adicionar a biblioteca Lottie. Existem algumas maneiras de adicionar Lottie ao nosso projeto, mas neste tutorial usaremos o Swift Package Manager (SPM). Observe que, na versão em vídeo deste tutorial acima, usamos o CocoaPods – você ainda pode usar o CocoaPods se preferir, mas usar o SPM reduz um pouco o trabalho.

Então, veja como fazer isso: com o Xcode em foco, na barra de navegação superior, selecione File->Add Packages… e, na parte superior, toque com o botão direito em Search or Enter Package URL e insira o URL:

https://github.com/airbnb/lottie-ios.git

Toque em Add Package no canto inferior direito e selecione seu projeto como destino. E terminamos a integração! 😄

Agora, vá até ViewController.swift e adicione a seguinte linha à parte superior do arquivo.

import Lottie

CMD+B e verifique se está tudo certo.

Navigate to ViewController.swift and import Lottie

Ótimo, agora para a parte divertida! Vamos nos animar!!!

Você pode escolher entre milhares de animações gratuitas no LottieFiles, mas, para o propósito deste tutorial que faremos juntos, vamos usar esta animação para começar.

Como às vezes nem todos os recursos do Lottie são suportados pelo iOS, é muito importante testar se o Lottie escolhido funciona no iOS. Para isso, certifique-se de baixar o aplicativo LottieFiles para iOS e escanear o código QR gerado na parte inferior em qualquer animação que seja carregada ou testada no LottieFiles. Quando você tiver certeza de que sua animação tem a aparência e o funcionamento adequados, baixe o arquivo Lottie.

Depois de baixado, arraste e solte no projeto, certificando-se de que nosso projeto esteja selecionado como target e copy items if needed esteja selecionado.

Drag and drop the Lottie into your project

Adicionando uma visualização de animação em Lottie por código

No arquivo ViewController.swift, substitua o método viewDidLoad pelo seguinte:

// 1. Create the LottieAnimationView
private var animationView: LottieAnimationView?

override func viewDidLoad() {

  super.viewDidLoad()
  
  // 2. Start LottieAnimationView with animation name (without extension)
  
  animationView = .init(name: "coffee")
  
  animationView!.frame = view.bounds
  
  // 3. Set animation content mode
  
  animationView!.contentMode = .scaleAspectFit
  
  // 4. Set animation loop mode
  
  animationView!.loopMode = .loop
  
  // 5. Adjust animation speed
  
  animationView!.animationSpeed = 0.5
  
  view.addSubview(animationView!)
  
  // 6. Play animation
  
  animationView!.play()
  
}

Você conseguiu! Pressione CMD+R e isso é o que você deve ver:

Lottie animation playing on a mobile screen

Neste ponto, eu realmente encorajo você a brincar com diferentes configurações.

Adicionando uma exibição de animação em Lottie usando o Interface Builder

Em seu Storyboard ou arquivo Xib, arraste e solte uma UIView em seu ViewController, adicione as restrições desejadas e posicione como quiser. Em seguida, no canto superior direito, vá até Identity Inspector, mude a classe para LottieAnimationView e defina o módulo como Lottie.

Add a Lottie animation view using Interface Builder

Depois, no canto superior direito, vá até Attribute Inspector e adicione o nome do arquivo de animação (sem a extensão).

Add the name of the animation file

No teclado, pressione CTRL+OPTION+CMD+ENTER para abrir a classe ViewController e pressione OPTION enquanto arrasta a exibição para dentro do ViewController.

Open ViewController class

Depois de vinculado, feche o Editor do lado direito e vá até ViewController.swift. Substitua a função viewDidLoad pelo seguinte:

override func viewDidLoad() {

  super.viewDidLoad()
  
  // 1. Set animation content mode
  
  animationView.contentMode = .scaleAspectFit
  
  // 2. Set animation loop mode
  
  animationView.loopMode = .loop
  
  // 3. Adjust animation speed
  
  animationView.animationSpeed = 0.5
  
  // 4. Play animation
  animationView.play()
}

E teste pressionando CMD+R. Os resultados devem ser semelhantes aos mostrados acima, considerando como você posicionou a visualização.

Usando animações de progresso

Ótimo, então agora você sabe como usar as animações em Lottie, mas em seguida seu aplicativo precisa de um toque de mágica extra para permitir que você controle como a animação é reproduzida, por exemplo, com barras de progresso ou animações com estados diferentes. Para este exemplo, criaremos uma animação de progresso de download com este arquivo. Da mesma forma que antes, baixe o arquivo e arraste e solte no projeto.

Ao abrir o arquivo no LottieFiles, você poderá deslizar pelo progresso da animação.

Mouse sliding through the animation playback seeker

Se você for cuidadoso o suficiente, poderá localizar o quadro exato de cada parte da animação (localizado no canto inferior esquerdo). No exemplo acima, localizamos 3 quadros-chave:

  • início do progresso: 140
  • fim do progresso: 187
  • download concluído: 240

E quanto aos quadros restantes?

  • 0->140: início da animação
  • 240->320: redefinição para o estado original

Com esses valores, criaremos um enum para facilitar o uso:

enum ProgressKeyFrames: CGFloat {

  case start = 140
  
  case end = 187
  
  case complete = 240
  
}

E agora, configure o LottieAnimationView em viewDidLoad:

private var progressView: LottieAnimationView?

override func viewDidLoad() {

  super.viewDidLoad()
  // make sure the name of the animation matches the imported file
  
  progressView = .init(name: "download")
  
  progressView!.frame = view.bounds
  
  progressView!.contentMode = .scaleAspectFit
  
  view.addSubview(progressView!)
  
}

E adicionamos mais 3 funções, para iniciar o download, para progredir até a conclusão e, finalmente, para completar o download.

// start the download

private func startProgress() {

  // play from frame 0 to the start download of progress
  
  progressView?.play(fromFrame: 0, toFrame: ProgressKeyFrames.start.rawValue, loopMode: .none) { [weak self] (_) in
  
    self?.startDownload()
	
  }
  
}

// progress from 0 to 100%

private func startDownload() {

  // play animation from start to end of download progress
  
  progressView?.play(fromFrame: ProgressKeyFrames.start.rawValue, toFrame: ProgressKeyFrames.end.rawValue, loopMode: .none) { [weak self] (_) in
  
    self?.endDownload()
	
  }
  
}

// download is completed, we show the completion state

private func endDownload() {

  // download is completed, we show the completion state
  
  progressView?.play(fromFrame: ProgressKeyFrames.end.rawValue, toFrame: ProgressKeyFrames.complete.rawValue, loopMode: .none)
  
}

E, finalmente, para testar, adicione o seguinte após o final do método viewDidLoad.

override func viewDidAppear(_ animated: Bool) {

  super.viewDidAppear(animated)
  
  startProgress()
  
}

É isso, agora você pode executar o aplicativo e deve ver o seguinte:

A Lottie loading animation on a mobile screen

Maravilha! Temos a animação completa! No entanto, você pode estar interessado em saber como fica quando baixa um arquivo. Veja como:

Primeiro, substituiremos a função startDownload pelo seguinte:

// start download

private func startDownload() {

  // 1. URL to download from
  
  let url = URL(string: "https://archive.org/download/SampleVideo1280x7205mb/SampleVideo_1280x720_5mb.mp4")!
  
  // 2. Setup download task and start download
  
  let configuration = URLSessionConfiguration.default
  
  let operationQueue = OperationQueue()
  
  let session = URLSession(configuration: configuration, delegate: self, delegateQueue: operationQueue)
  
  let downloadTask = session.downloadTask(with: url)
  
  downloadTask.resume()
  
}

Em seguida, para processar os eventos da tarefa de download, adicione este código à parte inferior do arquivo ViewController.swift.

// MARK: - Download Delegate

extension ViewController: URLSessionDownloadDelegate {
  // handles download progress
  
  func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
  
    let percentDownloaded: CGFloat = CGFloat(totalBytesWritten) / CGFloat(totalBytesExpectedToWrite)
	
    DispatchQueue.main.async {
	
      self.progress(to: percentDownloaded)
	  
    }
	
  }
  

  // finishes download
  
  func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
  
    DispatchQueue.main.async {
	
      self.endDownload()
	  
    }
	
  }
  
}

Finalmente, para mostrar a animação no progresso correto, adicionamos o seguinte código após a função startDownload:

// sets download progress

private func progress(to progress: CGFloat) {

  // 1. We get the range of frames specific for the progress from 0-100%
  
  let progressRange = ProgressKeyFrames.end.rawValue - ProgressKeyFrames.start.rawValue
  
  // 2. Then, we get the exact frame for the current progress
  
  let progressFrame = progressRange * progress
  
  // 3. Then we add the start frame to the progress frame
  // Considering the example that we start in 140, and we moved 30 frames in the progress, we should show frame 170 (140+30)
  
  let currentFrame = progressFrame + ProgressKeyFrames.start.rawValue
  
  // 4. Manually setting the current animation frame
  
  progressView?.currentFrame = currentFrame
  
  print("Downloading \((progress*100).rounded())%")
  
}

Pressione CMD+R novamente para executar o código e você verá o mesmo efeito de antes, mas dessa vez mostrando o progresso de um download real. Muito legal, né?

Isso conclui nosso tutorial. A essa altura, você deve ser capaz de brincar com animações e controlar seu progresso. Imagine as possibilidades que você tem pela frente. Portanto, não perca mais tempo, deixe a mágica fluir em seus aplicativos iOS!

O código completo deste tutorial pode ser encontrado aqui.

Feliz programação!

Saiba mais sobre o que mais você pode fazer com o Lottie em nossa seção do blog Trabalhando com o Lottie.