Animation 在SwiftUI中按视图高度设置视图动画

Animation 在SwiftUI中按视图高度设置视图动画,animation,swiftui,offset,Animation,Swiftui,Offset,我正在尝试创建一个视图,该视图将从屏幕底部为另一个内容视图设置动画。但是,以下代码起作用,因为内容视图的高度未知,200偏移可能不正确。如何获取内容的高度以正确偏移视图 struct Test<Content>: View where Content : View { @State var showing: Bool = false var content: Content var body: some View { VStack {

我正在尝试创建一个视图,该视图将从屏幕底部为另一个内容视图设置动画。但是,以下代码起作用,因为内容视图的高度未知,200偏移可能不正确。如何获取内容的高度以正确偏移视图

struct Test<Content>: View where Content : View {
    @State var showing: Bool = false
    var content: Content

    var body: some View {
        VStack {
            Button(action: {
                withAnimation {
                    self.showing.toggle()
                }
            }) {
                Text("Toggle")
            }

            Spacer()

            HStack {
                Spacer()

                content

                Spacer()
            }
            .background(Color.red)
            .padding(10)
            .offset(y: showing ? 200 : 0)

        }
    }
}
struct Test:View其中Content:View{
@状态变量显示:Bool=false
var-content:content
var body:一些观点{
VStack{
按钮(操作:{
动画片{
self.showing.toggle()
}
}) {
文本(“切换”)
}
垫片()
HStack{
垫片()
内容
垫片()
}
.背景(颜色.红色)
.填充(10)
.偏移量(y:显示?200:0)
}
}
}

这里有一种可能的方法,在对齐过程中直接从中读取
内容
高度

struct Test<Content>: View where Content : View {
    var content: Content

    @State private var showing: Bool = false
    @State private var contentHeight: CGFloat = .zero

    var body: some View {
        VStack {
            Button(action: {
                withAnimation {
                    self.showing.toggle()
                }
            }) {
                Text("Toggle")
            }

            Spacer()

            HStack {
                Spacer()

                content
                    .alignmentGuide(VerticalAlignment.center) { d in
                        DispatchQueue.main.async {
                            self.contentHeight = d.height
                        }
                        return d[VerticalAlignment.center]
                    }

                Spacer()
            }
            .background(Color.red)
            .padding(10)
            .offset(y: showing ? contentHeight : 0)

        }
    }
}
struct Test:View其中Content:View{
var-content:content
@状态私有变量显示:Bool=false
@国家私有变量contentHeight:CGFloat=.0
var body:一些观点{
VStack{
按钮(操作:{
动画片{
self.showing.toggle()
}
}) {
文本(“切换”)
}
垫片()
HStack{
垫片()
内容
.alignmentGuide(垂直对齐.中心){d英寸
DispatchQueue.main.async{
self.contentHeight=d.height
}
返回d[垂直对齐.中心]
}
垫片()
}
.背景(颜色.红色)
.填充(10)
.偏移量(y:显示?内容高度:0)
}
}
}