Si estás leyendo esto, significa que estás listo para añadir esa pizca de magia extra a tus aplicaciones iOS. Es hora de incorporar esos pequeños detalles que darán a tu aplicación un toque especial y harán que tus usuarios lloren de alegría cuando la vean porque es condenadamente bonita.

Salt bae meme gif

Es hora de incorporar algunas animaciones Lottie a tus aplicaciones para iOS.

¿Y cómo puede hacer esto oigo que te preguntas? Por supuesto, hay muchas maneras, pero la que vamos a ver aquí es Lottie.

Lo que abarcaremos en este artículo

Al final de este artículo, entenderás y serás capaz de construir tu propia aplicación iOS con animaciones Lottie personalizadas. Y esto es lo que vamos a construir juntos:

A mobile mockup playing Lottie animations

¿Qué es Lottie?

Un Lottie es un formato de archivo de animación basado en JSON que permite a los diseñadores enviar animaciones a cualquier plataforma con la misma facilidad que enviar activos estáticos. Puedes leer más sobre esto aquí.

De acuerdo, ¡estoy listo! ¿Cómo empiezo?

Impresionante, vamos a empezar por abrir Xcode y crear un nuevo proyecto iOS.

1. Abre Xcode, selecciona "Crear nuevo proyecto Xcode"
2. Selecciona iOS, luego "Aplicación de vista única"

Choose a new template in XCode

3. Añade el nombre del proyecto, la organización y el identificador. Selecciona Swift" y "Storyboard". Pulsa "Siguiente" y "Crear".

Give your project a name

Impresionante, tenemos el proyecto listo, ahora vamos a añadir la biblioteca Lottie. Hay varias formas de añadir Lottie a nuestro proyecto, pero en este tutorial, utilizaremos Swift Package Manager (SPM). Ten en cuenta que en la versión de video de este tutorial anterior, hemos utilizado CocoaPods; puedes seguir utilizando CocoaPods si lo prefieres, pero el uso de SPM te ahorra un poco de trabajo.

Así es como se hace: con Xcode en foco, en la barra de navegación superior, selecciona Archivo->Añadir paquetes..., luego en la parte superior, pulsa con el botón derecho sobre "Buscar" o "Introducir URL del paquete" e introduce la URL:

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

Pulsa en "Añadir paquete" en la esquina inferior derecha y selecciona tu proyecto como destino. ¡Y ya hemos terminado con la integración! 😄

Ahora, navega hasta ViewController.swift, añade la siguiente línea en la parte superior del archivo.

import Lottie

CMD+B y asegúrate de que todo está bien.

Navigate to ViewController.swift and import Lottie

‌Estupendo, ¡ahora viene la parte divertida! ¡¡¡Vamos a animarnos!!!

Puedes elegir entre miles de animaciones gratuitas en LottieFiles, pero a efectos de este tutorial que vamos a hacer juntos, vamos a utilizar esta animación para empezar.

Como a veces no todas las características de Lottie son compatibles con iOS, es sumamente importante probar que tu Lottie elegido funcione en iOS. Para eso, asegúrate de descargar la aplicación LottieFiles para iOS y escanear el código QR que se genera en la parte inferior debajo de cualquier animación que se suba o se pruebe en LottieFiles. Una vez que estés seguro de que tu animación se ve y se reproduce como debería, descarga el archivo Lottie.

Una vez descargado, arrástralo y suéltalo en el proyecto, asegurándote de que nuestro proyecto está seleccionado como destino y de que se seleccionan los elementos de copia si es necesario.

Drag and drop the Lottie into your project

Añadir una vista de animación Lottie por código

En el archivo ViewController.swift, sustituye el método viewDidLoad por lo siguiente:

// 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()
  
}

¡Lo has conseguido! Pulse CMD+R y esto es lo que deberías ver:

Lottie animation playing on a mobile screen

En este punto, realmente te animo a jugar con diferentes configuraciones.

Añadir una vista de animación Lottie utilizando Interface Builder

En tu Storyboard o archivo Xib, arrastra y suelta un UIView a su ViewController, añade las restricciones deseadas y posiciona a tu gusto. A continuación, en la esquina superior derecha, navega hasta el "Inspector de identidades", cambia la clase a LottieAnimationView y establece el módulo a Lottie.

Add a Lottie animation view using Interface Builder

‌Luego en la esquina superior derecha, desplácese al "Inspector de atributos" y añada el nombre del archivo de animación (sin la extensión).

Add the name of the animation file

‌En tu teclado, pulsa CTRL+OPTION+CMD+ENTER para abrir la clase ViewController y OPTION+Arrastrar vista a la parte superior de la envolvente ViewController.

Open ViewController class

‌Una vez vinculado, cierra el editor de la derecha y navega hasta ViewController.swift. Sustituye la función viewDidLoad por lo siguiente:

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()
}

Y pruébelo pulsando CMD+R. Los resultados deberían ser similares a los anteriores, teniendo en cuenta cómo has colocado la vista.

Utilizando animaciones de progreso

Genial, ahora ya sabes cómo utilizar las animaciones Lottie, pero a continuación tu aplicación necesita otro toque de magia, que te permita controlar cómo se reproduce tu animación, como por ejemplo tener barras de progreso o animaciones que tengan diferentes estados. Para este ejemplo, construiremos una animación de progreso de descarga con este archivo. Igual que antes, descarga el archivo y arrástralo y suéltalo en el proyecto.

Al abrir el archivo en LottieFiles, podrás deslizarte por el progreso de la animación.

Mouse sliding through the animation playback seeker

Si eres lo suficientemente cuidadoso, podrás localizar el fotograma exacto de cada parte de la animación (situado en la esquina inferior izquierda). En el ejemplo anterior, hemos localizado tres fotogramas clave:

  • inicio del progreso; 140
  • final del progreso: 187
  • descarga completa: 240

¿Qué ocurre con los fotogramas restantes?

  • 0->140: inicio de la animación
  • 240->320: vuelta al estado original

Teniendo esos valores, crearemos una enumeración para facilitarnos su uso:

enum ProgressKeyFrames: CGFloat {

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

Y ahora, configura el LottieAnimationView en 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!)
  
}

swift

Y añadimos tres funciones más, para iniciar la descarga, para progresar hasta la finalización y finalmente para completar la descarga.

// 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)
  
}

Y por último, para probarlo, añade lo siguiente después del final del método viewDidLoad.

override func viewDidAppear(_ animated: Bool) {

  super.viewDidAppear(animated)
  
  startProgress()
  
}

Eso es todo, ahora puedes ejecutar la aplicación y esto es lo que deberías ver:

A Lottie loading animation on a mobile screen

¡Impresionante! ¡Ya tenemos la animación completa! Sin embargo, puede que te interese saber cómo se ve cuando se descarga un archivo. Esta es la manera:

Primero, sustituiremos la función startDownload por la siguiente:

// 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()
  
}

Luego, para controlar los eventos de la tarea de descarga, añade este código al final de su archivo 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 la animación en el progreso correcto, añadiremos el siguiente código después de la función 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())%")
  
}

Pulsa CMD+R de nuevo para ejecutar el código y deberías ver el mismo efecto que antes, pero esta vez, mostrando el progreso de una descarga real. Bastante ingenioso, ¿verdad?

Con esto concluye nuestro tutorial. A estas alturas, ya deberías poder jugar con animaciones y controlar tu progreso. Imagina las posibilidades que te esperan. Así que no pierdas más tiempo, ¡deja que la magia fluya en tus aplicaciones iOS!

Puedes encontrar el código completo de este tutorial aquí.

¡Feliz codificación!

Obten más información sobre qué más puede hacer con Lottie en nuestra sección del blog "Trabajar con Lottie".