【问题标题】:SwiftUI: fade out viewSwiftUI:淡出视图
【发布时间】:2022-11-22 08:09:31
【问题描述】:

我有以下代码:

struct ContentView: View {
    
    @State var show = false
    
    var body: some View {
        
        VStack {
            
            ZStack {
                
                Color.black
                
                if show {
                    RoundedRectangle(cornerRadius: 20)
                        .fill(.brown)
                        .transition(.opacity)
                }
                
            }
            
            Button {
                withAnimation(.easeInOut(duration: 1)) {
                    show.toggle()
                }
            } label: {
                Text("TRIGGER")
            }

        }

    }
    
}

我希望 RoundedRectangle 淡入淡出。现在它只是淡入.这是我拥有的更复杂视图设置的简化版本。根据状态,我可能会看到我想要淡入或不淡入的视图。所以,我正在寻找一种淡入淡出的方法(就像现在可以使用的那样),但随后也会淡出,以便视图完全从层次结构中移除,而不仅仅是隐藏或其他东西。

我怎样才能让这段代码也淡出视图而不只是淡入?

作为参考,我遵循了这种方法:

https://swiftui-lab.com/advanced-transitions/

....
if show {
    LabelView()
         .animation(.easeInOut(duration: 1.0))
         .transition(.opacity)
    }
        
    Spacer()
        
    Button("Animate") {
        self.show.toggle()
    }.padding(20)
....

但是,就我而言,它并没有消失。

【问题讨论】:

    标签: ios swift animation swiftui


    【解决方案1】:

    您需要将不透明度直接链接到状态,以便它直接为任何更改设置动画。

    struct ContentView: View {
          @State var show = false
       
       var body: some View {
          VStack {
             ZStack {
                Color.black
                (RoundedRectangle(cornerRadius: 20)
                   .fill(.brown)
                   .opacity(show ? 1 : 0)
                )
             }
             
             Button {
                withAnimation(.easeInOut(duration: 1)) {
                   show.toggle()
                }
             } label: {
                Text("TRIGGER")
             }
          }
       }
    }
    

    编辑:反映要求删除视图的评论,而不仅仅是淡出...

    要删除视图(并触发 .onDisappear),您可以修改如下:

             ZStack {
                Color.black
                show ? (RoundedRectangle(cornerRadius: 20)
                   .fill(.brown)
                ).onDisappear{print("gone")}
                : nil
             }
    

    这将如上淡入/淡出,但实际上会删除视图并打印“消失”

    【讨论】:

    • 我确实尝试过这个并且它确实淡出,但是,视图并没有完全删除。不透明度仅为零。在这种情况下永远不会调用 onDisappear。我想知道为什么我在链接中引用的示例有效(至少这是他们在 swiftui-lab 上在线显示的内容)而我在此处的示例无效。
    • 正确,但问题是如何淡出和淡入,而不是将其移除。如果你想删除它,调整不透明度将不起作用(无论你怎么做)。你需要真正删除它......
    • 我确实将其作为我想在问题中实现的目标。 ...but then also fade out so that the view is totally removed ...。另外,我只是从 swift-lab 运行那个确切的代码。似乎不再起作用了。 Apple 必须更新此行为。
    • 我会尝试你的编辑看看。谢谢
    • 对不起 - 你做到了。我错过了。
    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 2016-02-28
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多