SwiftUI过渡及相关动画

时间:2020-07-14 12:32:28

标签: swiftui

我是SwiftUI的新手,我正在尝试制作一个简单的动画。这是我想要的: 屏幕上的一个按钮,单击时会显示一些文本。

我正在使用AnyTransition.offsetAnyTransition.animation API来控制动画延迟5秒。但是单击后它就会显示出来。如果我将AnyTransition.offset更改为AnyTransition.opacity,它将开始起作用。为什么?这是代码,非常简单。

import SwiftUI

struct ContentView: View {
    @State private var show = false
    
    var body: some View {
        VStack {
            Spacer()
            
            if show {
                Text("AAAA")
                    .transition(
                        AnyTransition
                            .offset(x: 100, y: 100)
                            //                            .opacity
                            .animation(
                                Animation
                                    .easeInOut(duration: 1)
                                    .delay(5)
                        )
                )
            }
            
            Spacer()
            
            Button("Click") {
                self.show.toggle()
            }
            .padding()
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这就是我想要的:当屏幕上有一个按钮时 单击,将显示一些文本。

为什么要这么复杂?只需使用opacity修饰符来检查状态,然后在其后加上animation

查看此处:

struct ContentView: View {
    
    @State private var show = false
    
    var body: some View {
        VStack {
            Spacer()
            
            //Opacity that checks if show is true/ false and an animation on the text
            Text("AAAA").opacity(self.show ? 1 : 0).animation(.easeIn)
            
            Spacer()
            
            Button("Click") {
                self.show.toggle()
            }
            .padding()
        }
    }

}

产生这个:

enter image description here

答案 1 :(得分:0)

它必须是一个在内容被删除或添加时为内容添加动画效果的容器。因此,这是您过渡的可能解决方案。

通过Xcode 11.4 / iOS 13.4测试

demo

VStack {
    if show {
        Text("AAAA")
            .transition(
                AnyTransition
                    .offset(x: 100, y: 100)
    //                            .opacity
        )
    }
}
.animation(Animation
            .easeInOut(duration: 1)
            .delay(1)     // decreased for testing
)