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?
You can animate other values by making your custom views or view modifiers conform to the Animatable protocol and telling SwiftUI about the value you want to animate.
By conforming to Animatable, you can effectively decouple the animation of your view from the concept of duration, as you give SwiftUI the ability to interpolate arbitrarily between two different values for animatableData.
'animation' was deprecated in iOS 15.0: Use withAnimation or animation (_:value:) instead. animation function without value parameter is marked to be deprecated in API: Value parameter provides a way to control when the animation should be played. Consider code below: Pay attention to animation modifier.
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:
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
}
}
}
}
.animation
now takes a second argument called value
.
https://developer.apple.com/documentation/swiftui/view/animation(_:value:)
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:
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()
)
https://developer.apple.com/forums/thread/688947
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With