ios - 带有 switch 语句的 SwiftUI 动画

标签 ios swift swiftui watchos

我了解简单动画在 SwiftUI 中的工作原理。但是,我有一个稍微复杂的 watchOS 应用程序。 View 状态由 switch 语句处理:

struct ContentView: View {
    @EnvironmentObject private var state: AppState

    @State private var selection = 1

    var body: some View {
        Group {
            switch state.view {
            case .start:
                TabView(selection: $selection) {
                    ActivityView()
                        .tag(0)
                    StartView()
                        .tag(1)
                    SettingsView()
                        .tag(2)
                }
            case .workout:
                TabView(selection: $selection) {
                    TakeoffControlView()
                        .tag(0)
                    TakeoffView()
                        .tag(1)
                }
            }

            // ...
        }
    }
}

在另一个 View 中我编辑 View 状态:

struct StartView: View {
    @EnvironmentObject private var state: AppState

    var body: some View {
        Button(action: {
            state.view = .workout
        }, label: {
            Text("Start")
        })
    }
}

如何添加动画以在不同情况之间进行转换?我尝试向 GroupTabView 和单个 View 添加动画,但没有成功。显然,我将状态更改包装在 withAnimation 中。但是,我无法让它发挥作用。任何想法如何使这项工作?

最佳答案

.transition() 只是定义过渡是什么,要获得预期的过渡动画,您必须在 withAnimation 中对 SourceOfTruth 进行更改() { ... } block 。

struct ContentView: View {
    @EnvironmentObject private var state: AppState

    @State private var selection = 1

    var body: some View {
        Group {
            switch state.view {
            case .start:
                TabView(selection: $selection) {
                    ActivityView()
                        .tag(0)
                    StartView()
                        .tag(1)
                    SettingsView()
                        .tag(2)
                }
                .transition(.slide)//<- here
                
            case .workout:
                TabView(selection: $selection) {
                    TakeoffControlView()
                        .tag(0)
                    TakeoffView()
                        .tag(1)
                }
                .transition(.slide)//<- here
            }

            // ...
        }
    }
}

struct StartView: View {
    @EnvironmentObject private var state: AppState

    var body: some View {
        Button(action: {
            withAnimation(.easeIn) {  //<- here
                state.view = .workout
            }
        }, label: {
            Text("Start")
        })
    }
}

关于ios - 带有 switch 语句的 SwiftUI 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66270438/

相关文章:

ios - CollectionView 中的刷新数据不起作用 Swift

ios - `.drive()` 和 `.bind(to:)` 之间的区别

Swift 包管理器,如何处理固定装置?

Swift 构建的协议(protocol)无法按预期工作

ios - 使用自动布局创建的 UILabel 不显示 NSMutableAttributedString 的属性

iphone - 我应该在 iPhone 程序中的什么地方放置文本、说明、描述等?

ios - 提取数据的 Realm 查询

swiftui - MFMessageComposeViewController + SwiftUI 错误行为

swift - 如何在 ForEach SwiftUI 中使用核心数据关系

ios - 如何在 SwiftUI 上使用堆栈定义列表内的行限制