首页 > 解决方案 > SwiftUI 没有隐藏动画

问题描述

我注意到,当我为背景着色时,删除视图时不会得到动画。

在此处输入图像描述

如果我删除Color(.orange).edgesIgnoringSafeArea(.all)然后隐藏动画将起作用,否则Modal会突然消失。有什么解决办法吗?

struct ContentView: View {
    @State var show = false
    
    func toggle() {
        withAnimation {
            show = true
        }
    }
    
    var body: some View {
        ZStack {
            
            Color(.orange).edgesIgnoringSafeArea(.all)
            
            Button(action: toggle) {
                Text("Modal")
            }
            
            if show {
                Modal(show: $show)
            }
        }
    }
}

struct Modal: View {
    @Binding var show: Bool
    
    func toggle() {
        withAnimation {
            show = false
        }
    }
    
    var body: some View {
        ZStack {
            Color(.systemGray4).edgesIgnoringSafeArea(.all)
            
            Button(action: toggle) {
                Text("Close")
            }
        }
    }
}

标签: swiftui

解决方案


您需要制作可动画容器来保存已移除的视图(这使得将动画保存在一个地方成为可能)。这是可能的解决方案。

使用 Xcode 12 / iOS 14 测试

struct ContentView: View {
    @State var show = false

    func toggle() {
        show = true      // animation not requried
    }

    var body: some View {
        ZStack {

            Color(.orange).edgesIgnoringSafeArea(.all)

            Button(action: toggle) {
                Text("Modal")
            }

                VStack {                      // << major changes
                    if show {
                         Modal(show: $show)
                    }
                }.animation(.default)        // << !!
        }
    }
}

struct Modal: View {
    @Binding var show: Bool

    func toggle() {
        show = false      // animation not requried
    }

    var body: some View {
        ZStack {
            Color(.systemGray4).edgesIgnoringSafeArea(.all)

            Button(action: toggle) {
                Text("Close")
            }
        }
    }
}

推荐阅读