ios SwiftUI:淡出视图

6tqwzwtp  于 2022-11-26  发布在  iOS
关注(0)|答案(2)|浏览(204)

下面的代码:

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)
....

但是,在我的情况下,它并没有淡出。

zazmityj

zazmityj1#

SwiftUI ZStack转换是很挑剔的。你需要添加一个zIndex来确保层次结构被保留,从而启用动画。

RoundedRectangle(cornerRadius: 20)
    .fill(.brown)
    .transition(.opacity)
    .zIndex(1) /// here!
bqujaahr

bqujaahr2#

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

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)
               .zIndex(1).  //kudos to @aheze for this!

            ).onDisappear{print("gone")}
            : nil
         }

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

相关问题