All posts

Engineering · Animation · Tooling

Top 5 iOS animation libraries

Lottie, Rive, Pow, and two more, in the order you'd actually reach for them. Real install snippets, and one thing every dead-library trap has in common.

Muhammad Afham · July 2026 · 4 min read

Check native first. SwiftUI's Animation.spring(), PhaseAnimator, and KeyframeAnimator now cover a surprising amount of what used to require a dependency. Reach for the list below when you need designer-authored assets, interactive state machines, or effects native APIs don't do in one line.

01 · Lottie

github.com/airbnb/lottie-ios · Apache 2.0 · actively maintained, the industry standard

The one nearly every app with a polished onboarding flow is using. Lottie renders animations exported from After Effects (via the Bodymovin plugin) as vector JSON, so a designer ships a real animation file and you drop it in, no engineer re-implementing keyframes by hand. If your team has a designer who lives in After Effects, this is the bridge.

// Package.swift
.package(url: "https://github.com/airbnb/lottie-spm.git", from: "4.4.0")

import Lottie
let animationView = LottieAnimationView(name: "onboarding-success")
animationView.loopMode = .playOnce
animationView.play()

Use it when

A designer hands you an After Effects animation and expects it to look exactly like the preview, pixel for pixel, at any size.

02 · Rive

github.com/rive-app/rive-ios · MIT · actively developed, real-time state machines

If Lottie is a video, Rive is a video game. Instead of a fixed timeline, animations are built as state machines that respond to input in real time, a button that squishes based on how hard you're pressing, a character that reacts to your app's actual data. It runs its own lightweight runtime rather than replaying frames, so it stays smooth even when the animation itself is complex.

// Package.swift
.package(url: "https://github.com/rive-app/rive-ios.git", from: "5.0.0")

import RiveRuntime
let view = RiveView()
let model = RiveViewModel(fileName: "loading_state")
model.setView(view)

Use it when

The animation needs to react to user input or app state live, not just play from start to finish.

03 · Pow

github.com/movingparts-io/Pow · MIT · SwiftUI-native, no external assets

Code-only, built specifically for SwiftUI. No JSON files, no design tool round-trip, just chainable view modifiers for the small "juice" moments: a view that shakes on error, a button that pops with an elastic bounce, a badge that appears with a spring. If your team is SwiftUI-only and doesn't have a motion designer, this covers most of what you'd otherwise hand-roll with withAnimation blocks.

// Package.swift
.package(url: "https://github.com/movingparts-io/Pow", from: "1.0.0")

import Pow
Text("Saved")
    .conditionalEffect(.pushDown, condition: isPressed)
    .transition(.movingParts.pop)

Use it when

You want native-feeling UI polish in SwiftUI without an art pipeline, and you're fine writing the effect as Swift code rather than an imported asset.

04 · Native SwiftUI: Animation, PhaseAnimator, KeyframeAnimator

Built into iOS 17+ · zero dependencies · the honest first stop

Worth naming explicitly rather than skipping past: Apple's own animation APIs have gotten genuinely good. PhaseAnimator sequences a view through discrete states without a state machine of your own, and KeyframeAnimator gives you per-property timelines, close to what a dedicated library used to be needed for.

PhaseAnimator([false, true]) { phase in
    Circle().scaleEffect(phase ? 1.2 : 1)
} animation: { _ in .spring(duration: 0.4, bounce: 0.5) }

Use it when

Almost always, first. Reach for a dependency only after you've hit something these can't do.

05 · ConfettiSwiftUI

github.com/simibac/ConfettiSwiftUI · MIT · small, focused, does one thing

The niche pick, included because "one thing done well" is worth celebrating on this list too. It's exactly what the name says: a confetti burst, triggered on a state change, for the one or two celebration moments an app actually has (a completed purchase, a finished onboarding). Not a general animation engine, and it shouldn't try to be one.

// Package.swift
.package(url: "https://github.com/simibac/ConfettiSwiftUI.git", from: "2.0.0")

import ConfettiSwiftUI
Text("🎉").confettiCannon(trigger: $didComplete)

Use it when

You have exactly one or two genuine celebration moments and don't want to hand-build particle physics for them.

One to avoid

Facebook's Pop was the standard recommendation for physics-based animation for years, and it's still copy-pasted into "best iOS libraries" lists in 2026. It was archived in March 2020 and is now read-only: no fixes, no Swift 6 support, no future. It's the clearest example of why "popular" and "currently correct" aren't the same question, and why every entry on this list was checked against its actual commit history before being written down, not just its reputation.

Which one to use

If you needReach for
A designer's After Effects file, pixel-exactLottie
Animation that reacts to live app stateRive
SwiftUI polish with zero external assetsPow
Anything a spring or keyframe timeline coversNative SwiftUI
One celebration momentConfettiSwiftUI

Building motion for a launch?

I help iOS teams pick the right tool and ship the actual polish. First session is free.

Book a free 1:1 Connect on LinkedIn