SwiftUI:将动画附加到过渡

时间:2019-11-30 14:12:07

标签: ios swift user-interface animation swiftui

根据Apple文档,我们应该能够将动画直接附加到过渡上。例如:

.transition(AnyTransition.slide.animation(.linear))

方法的文档:

extension AnyTransition {

    /// Attach an animation to this transition.
    public func animation(_ animation: Animation?) -> AnyTransition
}

说:

  

摘要

     

为该过渡添加动画。

但是我无法使其正常运行。看一下这个最小可行的示例(您可以复制粘贴并尝试一下):

import SwiftUI

struct AnimationTest: View {
    @State private var show = false
    var body: some View {
        VStack {
            if show {
                Color.green
                    .transition(AnyTransition.slide.animation(.linear))
            } else {
                Color.yellow
                    .transition(AnyTransition.slide.animation(.linear))
            }
            Button(action: {
                self.show.toggle()
            }, label: {
                Text("CHANGE VIEW!")
            })
        }
    }
}

struct AnimationTest_Previews: PreviewProvider {
    static var previews: some View {
        AnimationTest()
    }
}

如您所见,根本没有动画发生。有任何想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

您需要在withAnimation()闭包中包装布尔切换:

withAnimation {
    self.show.toggle()
}

测试了在模拟器上在Xcode 11.2.1上运行的过渡;画布无法预览。

请注意,直接应用于视图的动画/过渡会对该特定视图及其子视图产生影响。此外,根据文档:

func animation(Animation?) -> View
  

将给定的动画应用于视图中的所有可动画设置的值。

由于可设置动画的值(在本例中为启用过渡的布尔切换)位于“颜色”视图的外部,因此必须从在按钮动作中设置的位置显式对其进行动画处理。或者,可以将过渡效果直接附加到目标视图,但将动画应用于其容器,从而实现对show的更改的插值。因此,这也达到了预期的结果:

struct AnimationTest: View {
    @State private var show = false
    var body: some View {
        VStack {
            if show {
                Color.green
                    .transition(.slide)
            } else {
                Color.yellow
                    .transition(.slide)
            }
            Button(action: {
                self.show.toggle()
            }, label: {
                Text("CHANGE VIEW!")
            })
        }
        .animation(.linear)
    }
}