Motion & Micro-interactions

The Best SwiftUI Animation Libraries for 2026

SwiftUI's native animation is excellent, but designer-driven motion and prebuilt transitions still call for tooling. Here is an honest ranking of the libraries that make SwiftUI apps feel alive.

Last updated: 2026-07-17 7 min read By Ahmed Gagan, iOS Engineer
Quick Answer

For most SwiftUI apps, native SwiftUI animation plus Pow covers 90% of what you need — Pow gives you polished, drop-in transitions and effects with almost no code. Reach for Lottie when a designer hands you After Effects JSON, and Rive when you want interactive, state-driven vector animations that respond to app logic. Use swiftui-spring-animations as a reference cheat sheet rather than a dependency. Start native, add a library only when native runs out of road.

Best drop-in effects
Pow
Best for designer JSON
Lottie
Best interactive vector
Rive
Best default
Native SwiftUI

6 SwiftUI Animations, Running Live

Each preview loops the animation the code beneath it produces. Most of these need no library at all — iOS 17's spring, phaseAnimator and keyframeAnimator cover what used to require a dependency.

Spring Animation

iOS 17.0

The iOS 17 spring API — describe duration and bounce, not physics constants.

struct SpringDemo: View {
    @State private var expanded = false

    var body: some View {
        VStack {
            RoundedRectangle(cornerRadius: expanded ? 40 : 12)
                .fill(Color.accentColor)
                .frame(width: expanded ? 160 : 80, height: 80)

            Button("Toggle") { expanded.toggle() }
        }
        // iOS 17: duration + bounce is far easier to reason about than
        // response/dampingFraction. bounce 0 = smooth, 0.5 = very springy.
        .animation(.spring(duration: 0.45, bounce: 0.35), value: expanded)
    }
}

Hero Transition

iOS 16.0

matchedGeometryEffect — one element that appears to fly between two layouts.

struct HeroTransition: View {
    @Namespace private var ns
    @State private var isOpen = false

    var body: some View {
        ZStack {
            if isOpen {
                RoundedRectangle(cornerRadius: 24)
                    .fill(Color.accentColor)
                    .matchedGeometryEffect(id: "card", in: ns)
                    .frame(width: 240, height: 200)
                    .onTapGesture { isOpen = false }
            } else {
                RoundedRectangle(cornerRadius: 12)
                    .fill(Color.accentColor)
                    .matchedGeometryEffect(id: "card", in: ns)
                    .frame(width: 80, height: 80)
                    .onTapGesture { isOpen = true }
            }
        }
        // The id must be identical on both branches, and only ONE may be in
        // the hierarchy at a time — otherwise SwiftUI cannot pair them.
        .animation(.spring(duration: 0.45, bounce: 0.2), value: isOpen)
    }
}

Phase Animator

iOS 17.0

Cycle a view through discrete phases — no state machine to hand-write.

struct PulsingBadge: View {
    var body: some View {
        Image(systemName: "bell.fill")
            .font(.largeTitle)
            .foregroundStyle(Color.accentColor)
            // Each phase is applied in turn, then it loops.
            .phaseAnimator([1.0, 1.25, 1.0]) { view, scale in
                view.scaleEffect(scale)
            } animation: { _ in
                .spring(duration: 0.4, bounce: 0.5)
            }
    }
}

Keyframe Animation

iOS 17.0

Independent tracks for scale, rotation and offset — the CSS-keyframes model.

struct BounceValues {
    var scale = 1.0
    var yOffset = 0.0
}

struct KeyframeDemo: View {
    @State private var trigger = 0

    var body: some View {
        Image(systemName: "heart.fill")
            .font(.system(size: 44))
            .foregroundStyle(.red)
            .keyframeAnimator(initialValue: BounceValues(), trigger: trigger) { view, value in
                view.scaleEffect(value.scale).offset(y: value.yOffset)
            } keyframes: { _ in
                KeyframeTrack(\.scale) {
                    SpringKeyframe(1.3, duration: 0.18)
                    SpringKeyframe(1.0, duration: 0.32, spring: .bouncy)
                }
                KeyframeTrack(\.yOffset) {
                    CubicKeyframe(-22, duration: 0.22)
                    CubicKeyframe(0, duration: 0.28)
                }
            }
            .onTapGesture { trigger += 1 }
    }
}
Now you see me

Combined Transition

iOS 16.0

Asymmetric insert/remove — content should not leave the way it arrived.

struct TransitionDemo: View {
    @State private var show = false

    var body: some View {
        VStack {
            if show {
                Text("Now you see me")
                    .padding()
                    .background(Color.accentColor, in: .rect(cornerRadius: 12))
                    .transition(
                        .asymmetric(
                            insertion: .move(edge: .bottom).combined(with: .opacity),
                            removal: .scale(scale: 0.85).combined(with: .opacity)
                        )
                    )
            }
            Button("Toggle") { show.toggle() }
        }
        .animation(.spring(duration: 0.35, bounce: 0.25), value: show)
    }
}

Symbol Effect

iOS 17.0

Animate SF Symbols themselves — bounce, pulse, variableColor, replace.

struct SymbolEffects: View {
    @State private var isFavourite = false
    @State private var count = 0

    var body: some View {
        HStack(spacing: 28) {
            // .replace cross-fades between two symbols
            Image(systemName: isFavourite ? "star.fill" : "star")
                .contentTransition(.symbolEffect(.replace))
                .onTapGesture { isFavourite.toggle() }

            // .bounce fires each time the trigger value changes
            Image(systemName: "bell.fill")
                .symbolEffect(.bounce, value: count)
                .onTapGesture { count += 1 }

            // .variableColor animates the fill level continuously
            Image(systemName: "wifi")
                .symbolEffect(.variableColor.iterative.reversing)
        }
        .font(.largeTitle)
        .foregroundStyle(Color.accentColor)
    }
}
Free download

6 SwiftUI animation snippets as one Swift file

Spring, hero transition, phase animator, keyframes, combined transitions and SF Symbol effects — the code behind every preview above, ready to paste.

  • All 6 animations, copy-paste ready
  • iOS 17 APIs gated correctly
  • No third-party dependency required
  • MIT licensed, commercial use fine

Instant download, no confirmation step. Occasional SwiftUI tips — unsubscribe anytime.

Native first, library second

The most common mistake is reaching for Lottie or a heavy runtime for motion that native SwiftUI handles in five lines. Since iOS 17, keyframe animations and phase animators cover elaborate sequences natively. Add Pow when you want polish fast, Lottie or Rive only when the motion is genuinely designer-authored or interactive beyond what code should express by hand.

  • UI state transitions: native withAnimation and transitions
  • Premium micro-interactions fast: Pow
  • Complex illustrated motion from a designer: Lottie
  • Interactive, state-reactive characters: Rive

Ship your SwiftUI app in 5 emails

A free 5-part course on the parts that actually stall launches: paywall, auth, onboarding, App Store review, and pricing. No fluff, unsubscribe anytime.

Motion, onboarding, and design system already wired

The Swift Kit ships a centralized design system and animated onboarding flow built on native SwiftUI, so your app feels polished on day one without gluing motion libraries together yourself.

Get The Swift Kit — $99

Short on time?

I can set the kit up for your app and hand back a running Xcode project — from $499. Source code still yours.

See done-for-you

5 ways to add motion to SwiftUI

These range from a zero-dependency native approach to full designer-driven runtimes. Most production apps end up combining native animation with exactly one of these libraries.

  1. 1

    Native SwiftUI animation

    Start here

    withAnimation, .animation, transitions, matchedGeometryEffect, phase animators, and Keyframe animations cover an enormous range with zero dependencies. iOS 17+ added keyframes and phase animators that closed most of the gap with third-party tools.

    Pros
    • No dependency, fully first-party and future-proof
    • Spring, keyframe, and phase animators built in
    • matchedGeometryEffect for hero transitions
    • Best performance and integration
    Cons
    • Complex choreography gets verbose
    • No designer handoff format
    • Advanced particle/physics effects need hand-rolling
    Learn more
  2. 2

    Pow

    Best micro-interactions

    Pow by Movingparts is a curated set of SwiftUI transitions and change effects — confetti, shine, jiggle, smooth morphs — that drop in as one-line modifiers. It is the fastest way to make an app feel premium.

    Pros
    • One-line, idiomatic SwiftUI modifiers
    • Beautiful, tasteful default effects
    • Tiny integration cost
    • Pure SwiftUI, no runtime engine
    Cons
    • Effects are curated, not fully custom
    • Commercial license for the full set
    • Not for full-frame character animation
  3. 3

    Lottie (lottie-ios)

    Designer handoff

    Airbnb's Lottie renders After Effects animations exported as JSON via the Bodymovin plugin. It is the industry standard for shipping complex, designer-authored motion like onboarding illustrations and loading states.

    Pros
    • Designers author in After Effects, you just render
    • Huge ecosystem and free animation marketplaces
    • Cross-platform parity with Android/web
    • Great for onboarding and empty states
    Cons
    • JSON files can be heavy and CPU-costly
    • Not interactive by default — plays timelines
    • Overkill for simple UI transitions
    • Rendering fidelity varies for exotic AE features
  4. 4

    Rive

    Interactive vector

    Rive is both an editor and a runtime for interactive, state-machine-driven vector animations. Unlike Lottie's fixed timelines, Rive animations react to inputs and app state, making it ideal for interactive characters and controls.

    Pros
    • State machines drive animation from app logic
    • Far smaller files than equivalent Lottie
    • Truly interactive, not just playback
    • Own editor with live preview
    Cons
    • Requires learning the Rive editor
    • Smaller asset ecosystem than Lottie
    • Team needs Rive authoring skills
    • Runtime is another dependency to track
  5. 5

    swiftui-spring-animations

    Reference collection

    An open-source catalog of spring animation configurations with visual previews. It is less a runtime dependency and more a cheat sheet for dialing in response, damping, and blend duration on native SwiftUI springs.

    Pros
    • Great for learning spring parameters
    • No real runtime cost — copy values into native code
    • Free and open source
    Cons
    • Not a full animation engine
    • You still write native animation code
    • Maintenance depends on the community

Lottie vs Rive

Lottie vs Rive comparison
FeatureLottieRive
Authoring toolAfter EffectsRive editor
Interactive / state-driven
Typical file sizeLargerSmaller
Asset ecosystemVery largeGrowing
Best forFixed illustrated motionInteractive vector UI

Frequently Asked Questions

Do I still need an animation library with SwiftUI's native keyframe and phase animators?
For most UI motion, no. Since iOS 17, keyframe animations and phase animators handle elaborate sequences natively with no dependency. You only need a library when the motion is designer-authored (Lottie), interactive and state-driven (Rive), or when you want premium micro-interactions instantly without writing them (Pow).
Is Pow free to use in a commercial SwiftUI app?
Pow offers a free set of effects, but the full library is commercially licensed. For a shipping product you should review Movingparts' current license terms and budget for it if you rely on the full effect catalog. It is priced as a one-time-feeling developer library rather than a per-seat subscription in most cases.
Why would I choose Rive over Lottie for iOS animations?
Choose Rive when the animation must react to app state or user input rather than just play a fixed timeline. Rive's state machines let a character or control respond to logic, and its files are typically much smaller than equivalent Lottie JSON. Stick with Lottie when you have existing After Effects assets and only need timeline playback.
Are Lottie JSON animations expensive for iOS performance?
They can be. Complex Lottie files with many layers and effects consume CPU during rendering, which matters on older devices and in scrolling contexts. Keep files lean, avoid Lottie for tiny UI transitions native SwiftUI handles cheaply, and profile in Instruments if you ship several animations on one screen.
What is the lightest way to add spring physics to SwiftUI animations?
Use native SwiftUI springs — the .spring animation with response, dampingFraction, and blendDuration, or the newer spring presets. The swiftui-spring-animations reference catalog helps you pick values without adding a runtime dependency, since you copy the parameters straight into native code.

Keep exploring

A polished SwiftUI app, minus the setup

The Swift Kit is a $99 one-time SwiftUI boilerplate with a design system, onboarding, auth, and paywalls ready to go. iOS 16+, iOS 26 Liquid Glass, lifetime updates.

Get The Swift Kit — $99

One-time purchase · Lifetime updates · 14-day refund