How to replace deprecated .animation() in SwiftUI?

Viewed 18427

The .animation() modifier has been deprecated in iOS 15, but I'm not sure I understand how Xcode's suggested equivalent, animation(_:value:), works.

.animation(.easeInOut(duration: 2)) // ⚠️'animation' was deprecated in iOS 15.0: Use withAnimation or animation(_:value:) instead.

How would I change my code to get rid of the warning?

5 Answers

You need tell Xcode what exactly should be animated! With given a variable that conform to Equatable protocol. That could be State or Binding or any other wrapper that allow you to update the value of it.

Example:

struct ContentView: View {
    
    @State private var offset: CGFloat = 200.0
    
    var body: some View {
        
        Image(systemName: "ant")
            .font(Font.system(size: 100.0))
            .offset(y: offset)
            .shadow(radius: 10.0)
            .onTapGesture { offset -= 100.0 }
            .animation(Animation.easeInOut(duration: 1.0), value: offset)
        
    }
}

Result:

enter image description here

You can also use the animation by using a boolean as the value.

Example Below: When you tap the CardView(), it will toggle show which in turn will animate the offset both ways.

@State var show = false

CardView()
 .offset(x: 0, y: show ? -100 : -10)
 .animation(.easeInOut(duration: 1.0), value: show)
 .onTapGesture {
   show.toggle()
 }

Another approach would be to embed ontapGesture in a withAnimation

struct SwiftUWithAnimation: View {
@State private var offset: CGFloat = .zero

var body: some View {
    
    Circle()
        .frame(width: 100, height: 100, alignment: .center)
        .offset(x: 0, y: offset)
        .onTapGesture {
            withAnimation(.default) {
                offset += 100.0
         }
      }
   }
}

UUID


extension View {
    func withoutAnimation() -> some View {
        self.animation(nil, value: UUID())
    }
}


demo

// .animation(Animation.easeInOut(duration: 1.5).repeatForever(autoreverses: true))
// ⚠️ 'animation' was deprecated in iOS 15.0: Use withAnimation or animation(_:value:) instead.


// value: UUID ✅
.animation(Animation.easeInOut(duration: 1.5).repeatForever(autoreverses: true), value: UUID())


refs

https://developer.apple.com/forums/thread/688947

Related