Skip to main content

How to start an animation immediately after a view appears

About 2 minSwiftSwiftUIArticle(s)bloghackingwithswift.comcrashcourseswiftswiftuixcodeappstore

How to start an animation immediately after a view appears 관련

SwiftUI by Example

Back to Home

How to start an animation immediately after a view appears | SwiftUI by Example

How to start an animation immediately after a view appears

Updated for Xcode 15

If you want a SwiftUI view to start animating as soon as it appears, you should use the nAppear() modifier to attach an animation. I’ll show you the basic code first, then show you two extensions I use to make this process easier.

First, the simple version – this creates a circle that scales up and down forever:

struct ContentView: View {
    @State var scale = 1.0

    var body: some View {
        Circle()
            .frame(width: 200, height: 200)
            .scaleEffect(scale)
            .onAppear {
                let baseAnimation = Animation.easeInOut(duration: 1)
                let repeated = baseAnimation.repeatForever(autoreverses: true)

                withAnimation(repeated) {
                    scale = 0.5
                }
            }
    }
}

Download this as an Xcode projectopen in new window

If you intend to add initial animations frequently, it’s a smart idea to add some extensions to the View protocol to make it easier.

To demonstrate this, the two extensions below add animate() and animateForever() modifiers that let you customize the animation you want and also wrap up the whole behavior neatly:

// Create an immediate animation.
extension View {
    func animate(using animation: Animation = .easeInOut(duration: 1), _ action: @escaping () -> Void) -> some View {
        onAppear {
            withAnimation(animation) {
                action()
            }
        }
    }
}

// Create an immediate, looping animation
extension View {
    func animateForever(using animation: Animation = .easeInOut(duration: 1), autoreverses: Bool = false, _ action: @escaping () -> Void) -> some View {
        let repeated = animation.repeatForever(autoreverses: autoreverses)

        return onAppear {
            withAnimation(repeated) {
                action()
            }
        }
    }
}

// Try out our extensions with the scaling circle.
struct ContentView: View {
    @State var scale = 1.0

    var body: some View {
        Circle()
            .frame(width: 200, height: 200)
            .scaleEffect(scale)
            .animateForever(autoreverses: true) { scale = 0.5 }
    }
}

Download this as an Xcode projectopen in new window

Similar solutions…
How to make a ScrollView start at the bottom | SwiftUI by Example

How to make a ScrollView start at the bottom
SwiftUI tips and tricks | SwiftUI by Example

SwiftUI tips and tricks
How to follow this quick start guide | SwiftUI by Example

How to follow this quick start guide
How to create an explicit animation | SwiftUI by Example

How to create an explicit animation
How to create a spring animation | SwiftUI by Example

How to create a spring animation

이찬희 (MarkiiimarK)
Never Stop Learning.