skip to Main Content

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


  1. .animation now takes a second argument called value.

    https://developer.apple.com/documentation/swiftui/view/animation(_:value🙂

    Login or Signup to reply.
  2. 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

    Login or Signup to reply.
  3. 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
             }
          }
       }
    }
    
    Login or Signup to reply.
  4. 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()
     }
    
    Login or Signup to reply.
  5. 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

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search