【问题标题】:SwiftUI no hide animationSwiftUI 没有隐藏动画
【发布时间】:2023-03-21 15:50:02
【问题描述】:

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

如果我删除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


    【解决方案1】:

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

    使用 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")
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2021-02-20
      • 2023-03-14
      • 1970-01-01
      • 2021-09-22
      • 2016-02-13
      • 1970-01-01
      相关资源
      最近更新 更多