【问题标题】:How to replace deprecated .animation() in SwiftUI?如何在 SwiftUI 中替换已弃用的 .animation()?
【发布时间】:2021-11-25 07:51:47
【问题描述】:

.animation() 修饰符在 iOS 15 中已被弃用,但我不确定我是否理解 Xcode 建议的等效项 animation(_:value:) 的工作原理。

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

如何更改我的代码以消除警告?

【问题讨论】:

    标签: xcode swiftui ios15


    【解决方案1】:

    您需要告诉 Xcode 究竟应该对什么进行动画处理!给定一个符合 Equatable 协议的变量。这可能是 State 或 Binding 或任何其他允许您更新它的值的包装器。

    示例:

    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)
            
        }
    }
    

    结果:

    【讨论】:

    • 我没有关注这个。你能提供一个代码示例吗?谢谢。
    • 是的,我为您更新了一个示例,1 分钟
    • 好的。我仍然不完全明白为什么这是不同/更好的(你能解释一下吗?),但我让它工作了。谢谢。
    • 我相信 Apple 做出了正确的决定来弃用 .animation(animation:),因为当你和我使用该修饰符时,SwiftUI 会将动画应用于任何价值变化的事物!这可能不是我们的目标!它甚至可以给出不需要的或有线的动画!或额外的 CPU 负载!使用这种新方法,我们明确地说明了我们需要什么来获得动画!也有不好的一面!现在我们应该使用这么多这样的修饰符来覆盖所有应该被动画化的值!
    【解决方案2】:

    .animation 现在接受名为value 的第二个参数。

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

    【讨论】:

    • nil 怎么可能符合 Equatable?你能适应吗?
    • 奇怪的是,警告消失了,但现在上面的.rotation3DEffect() 出现错误:“无法推断通用参数'V'”
    • 好吧,nil 不工作。请参阅文档以获取更多帮助:developer.apple.com/documentation/swiftui/view/…
    【解决方案3】:

    另一种方法是将 ontapGesture 嵌入到 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
             }
          }
       }
    }
    

    【讨论】:

      【解决方案4】:

      您也可以通过使用布尔值作为值来使用动画。

      示例如下: 当您点击 CardView() 时,它会切换显示哪个反过来会以两种方式为偏移设置动画。

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

      【讨论】:

        猜你喜欢
        • 2020-02-27
        • 2020-06-07
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 2018-07-05
        • 1970-01-01
        相关资源
        最近更新 更多