iOSアプリにちょっとした魔法を加える準備ができました。アプリに優位性を与え、ユーザーがそれを見て思わずうれしくなるような小さな要素を散りばめる時が来ました。

Salt bae meme gif

LottieのアニメーションをiOSアプリにちりばめるときが来ました。

「どうすればそれができるの?」という声が聞こえてくるようですが、多くの方法がある中で、ここではLottieでの使用方法をみていきます。

この記事で取り上げる内容

この記事の終わりまでに、Lottieのカスタム アニメーションを使用して、独自のiOSアプリを作成できるようになります。 そして、一緒に構築していくのはこちらです:

A mobile mockup playing Lottie animations

Lottieとは?

LottieはJSONベースのアニメーションファイル形式です。デザイナーはこれを使うことで、静止画アセットと同じくらい簡単に、アニメーションをあらゆるプラットフォームに配信できます。 詳細については、こちらをご覧ください

準備ができました! 何から始めたらよいですか?

Xcodeを開いて、新しいiOSプロジェクトを作成することから始めましょう。

1. Xcodeを開き、[Create new Xcode project] を選択します。
2. iOSを選択し、[Single View App]を選択します。

Choose a new template in XCode

3.プロジェクト、組織、および識別子の名前を追加します。[Swift]と[Storyboard]を選択し、Next>Createで作成します。

Give your project a name

順調です。プロジェクトの準備ができたので、Lottieライブラリを追加しましょう。 Lottieをプロジェクトに追加する方法はいくつかありますが、このチュートリアルではSwift Package Manager(SPM)を使用します。上記のチュートリアルのビデオバージョンではCocoaPodsを使用していることに注意してください。必要に応じて今でもCocoaPodsを使用することもできますが、SPM を使用することで多少の手間が省けます。

やり方は次のとおりです。Xcodeにフォーカスした状態で、上部のナビゲーション バーで[File->Add Packages…]を選択し、上部で [Search] または [Enter Package URL]を右タップして、URLを入力します。

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

右下隅にある [Add Package]をタップし、プロジェクトをターゲットとして選択します。これで統合の完了です! 😄

ViewController.swift に移動して、次のラインをファイルの先頭に追加します。

import Lottie

CMD + B を押して、すべてに問題がないことを確認してください

Navigate to ViewController.swift and import Lottie

素晴らしい。これからが楽しい部分です! アニメーションにしていきましょう!!

LottieFilesにある1,000以上の無料のアニメーションから選択できますが、このチュートリアルでは一緒に作業を行っていくので、まず最初にこちらのアニメーションを使用します。

Lottieのすべての機能がiOSでサポートされているとは限らないため、選択したLottieがiOSで動作するかテストを行うことが非常に重要です。テストを行うには、必ずiOS用のLottieFilesアプリをダウンロードし、LottieFilesにアップロードされるか、またはLottieFilesでテストされたアニメーションの下に生成されるQRコードをスキャンしてください。アニメーションの外観とそれがどのように再生されるか確認したらLottieファイルをダウンロードします。

ダウンロードをしたら、プロジェクトにドラッグ アンド ドロップし、プロジェクトがターゲットとして選択されていることと、「必要に応じて項目をコピーする」が選択されていることを確認します。

Drag and drop the Lottie into your project

コードによるLottieアニメーション ビューの追加

ViewController.swift fileで、viewDidLoadメソッドを次のように置き換えます。

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

できました! CMD+Rを押すと、次のように表示されます。

Lottie animation playing on a mobile screen

この時点で、さまざまな構成を試してみることを強くお勧めします。

Interface Builderを使用してLottieアニメーション ビューを追加する

StoryboardまたはXib fileで、UIViewをViewControllerにドラッグ アンド ドロップし、希望するConstrainと位置をお好みで追加します。次に、右上隅のIdentity Inspectorに移動し、クラスをLottieAnimationViewに変更し、モジュールをLottieに設定します。

Add a Lottie animation view using Interface Builder

次に、右上隅のAttribute Inspectorに移動し、アニメーション ファイルの名前を(拡張子なしで)追加します。

Add the name of the animation file

キーボードで、CTRL+OPTION+CMD+ENTERを押してViewControllerクラスを開き、OPTION+DragでビューをController Enclosureの上部にドラッグします。

Open ViewController class

リンクしたら、右側のEditorを閉じて、ViewController.swiftに移動します。 viewDidLoadファンクションを次のように置き換えます。

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

CMD+Rを押してテストします。ビューをどのように配置したかにもよりますが、結果は上記のようなものになるはずです。

プログレス アニメーションの使用

これでLottieのアニメーションの使用方法を把握することができましたが、次にアプリケーションに少々魔法を加える必要があります。プログレスバーやさまざまな状態のアニメーションなどを加えることで、アニメーションの再生方法を制御できるようになります。例では、このファイルを使用してダウンロードの際のプログレス アニメーションを作成します。 先ほどと同じようにファイルをダウンロードして、プロジェクトにドラッグ アンド ドロップします。

LottieFilesでファイルを開くと、アニメーションの進行状況をスライドできます。

Mouse sliding through the animation playback seeker

よく注意すれば、アニメーションの各部分の正確なフレームを見つけることができます(左下隅にあります)。 上記の例では、3つのキー フレームが見つかりました。

  • プログレス開始: 140
  • プログレス終了: 187
  • ダウンロード完了:240

残りのフレームについてはどうでしょうか?

  • 0->140:アニメーションの開始
  • 240->320:元の状態にリセット中

これらの値を使用して使いやすくするために、ENUMを作成します。

enum ProgressKeyFrames: CGFloat {

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

次に、viewDidLoadにLottieAnimationViewをセットアップします。

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

さらに、ダウンロードを開始し、完了まで進行し、最後にダウンロードを完了するという3つのファンクションを追加します。

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

最後に、それをテストするために、viewDidLoadメソッドの末尾に次を追加します。

override func viewDidAppear(_ animated: Bool) {

  super.viewDidAppear(animated)
  
  startProgress()
  
}

それだけです。アプリケーションを実行すると、次のように表示されます。

A Lottie loading animation on a mobile screen

素晴らしい! 完全なアニメーションができあがりました! しかし、ファイルをダウンロードするときにどのように見えるかを知りたい場合があります。 方法は次のとおりです。

まず、startDownloadファンクションを次のように置き換えます。

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

次に、ダウンロード タスク イベントを処理するために、このコードをViewController.swift fileの最後に追加します。

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

最後に、正しい進行状況でアニメーションを表示するために、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())%")
  
}

もう一度CMD+Rを押してコードを実行すると、前と同じ結果が表示されますが、今回は実際のダウンロードの進行状況が表示されます。素敵でしょう?

これでチュートリアルは終了です。これで、アニメーションを操作してプログレスを制御できるようになったはずです。目の前に広がる可能性を想像してみてください。もう時間を無駄にせず、iOSアプリケーションに魔法をどんどんかけていきましょう!

このチュートリアルの完全なコードは、こちらにあります

ハッピーコーディング!

Lottieでできることの詳細については、Lottieのブログ セクションをご覧ください。