对偏移设置动画时删除/添加SwiftUI视图的动画

时间:2020-07-03 14:51:10

标签: ios swift animation swiftui

我正在尝试为SwiftUI视图的偏移量设置动画,同时淡出并删除该视图的子视图。我遇到的问题是SwiftUI执行偏移和淡出动画,但没有将它们组合在一起。

我想实现的动画效果是使整个SubView的位置动画化,同时使字幕文本淡出,从而使字幕文本在淡入或淡出时垂直移动。我可以通过对Text的不透明度进行动画处理而不是删除它来实现此目的,但这意味着文本仍将占据“布局空间”。

是否可以通过if showSubtitle语句来实现此动画?

以下代码和GIF演示了此问题:

struct ContentView: View {
    @State private var showSubtitle = true
    var body: some View {
        SubView(showSubtitle: showSubtitle)
            .animation(.default)
            .offset(y: showSubtitle ? 100 : 0)
            .onTapGesture {
                self.showSubtitle.toggle()
            }
    }
}

struct SubView: View {
    let showSubtitle: Bool
    var body: some View {
        VStack {
            Text("Header")
            if showSubtitle {
                Text("Subtitle")
            }
        }
    }
}

Video

1 个答案:

答案 0 :(得分:1)

实际上观察到的行为是因为 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project TestCases: Failed to clean project: Failed to delete /Users/administrator/qa-automation/01LoginProject/TestCases/target/surefire-reports/testng.css -> [Help 1] 不更改布局,视图位于同一位置。因此,当您删除子视图时,它会被就地删除 并对其进行动画处理(默认为.offset过渡)。开始 offset 的零件不包含子视图,因此在上移零件时看不到它。

这里可能会产生您所期望的某种效果,但是过渡是基于源大小的,因此距离不是那么远,而是手动指定的偏移距离。无论如何,请尝试:

.opacity

通过Xcode 12 / iOS 14测试

demo