显示.sheet时设置SwiftUI视图的动画

显示.sheet时设置SwiftUI视图的动画,swiftui,Swiftui,我有一个SheetAnimationView,我想从中显示一个名为SheetContentView的工作表 当工作表出现时,我希望显示其内容的过渡动画(当内容出现时启动动画),但无法使其工作。VStack中的所有3个视图最好同时结束动画 SheetContentView: struct SheetContentView: View { @Binding var showSheet: Bool var body: some View { VStack(sp

我有一个
SheetAnimationView
,我想从中显示一个名为
SheetContentView
的工作表

当工作表出现时,我希望显示其内容的过渡动画(当内容出现时启动动画),但无法使其工作。VStack中的所有3个视图最好同时结束动画

SheetContentView:

struct SheetContentView: View {
    @Binding var showSheet: Bool
    
    var body: some View {
        VStack(spacing: 8) {
            Text("A great content of my new sheet")
            Label("still not done", systemImage: "guitars")
            Text("I'm done now")
        }
        .transition(.asymmetric(insertion: .scale, removal: .opacity)) // <--- I want this to work
        .animation(Animation.easeInOut(duration: 2)) // <--- for 2 seconds
        
    }
}

提前感谢。

当视图出现在视图层次结构中(而不是屏幕上)时,转换会起作用,所以要解决这个问题,我们需要另一个容器和状态

这是一个固定的变体。使用Xcode 12.1/iOS 14.1进行测试

struct SheetContentView:View{
@绑定变量展示表:Bool
@国家私有变量isShown=false
var body:一些观点{
VStack{//用于设置过渡动画的容器!!
如果是这样{
VStack(间距:8){
文本(“我的新工作表的重要内容”)
标签(“仍未完成”,系统图像:“吉他”)
文本(“我现在完成了”)
}
.transition(.不对称(插入:。缩放,删除:。不透明度))
}
}
.animation(animation.easeInOut(持续时间:2))
奥纳佩尔先生{

isShown=true//谢谢。我尝试了类似的代码,但把动画放错了位置。
struct SheetAnimationView: View {
    @State var showSheet: Bool = false
    
    var body: some View {
        Button("show my sheet with animated content (hopefully)") {
            showSheet = true
        }
        .sheet(isPresented: $showSheet) {
            SheetContentView(showSheet: $showSheet)
        }
        
    }
}
struct SheetContentView: View {
    @Binding var showSheet: Bool
    @State private var isShown = false
    var body: some View {
        VStack {            // container to animate transition !!
            if isShown {
                VStack(spacing: 8) {
                    Text("A great content of my new sheet")
                    Label("still not done", systemImage: "guitars")
                    Text("I'm done now")
                }
                .transition(.asymmetric(insertion: .scale, removal: .opacity))
            }
        }
        .animation(Animation.easeInOut(duration: 2))
        .onAppear {
            isShown = true       // << activate !!
        }
    }
}