Анимация вида по его высоте в SwiftUI - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь создать вид, который будет анимировать другой вид контента в нижней части экрана. Приведенный ниже код работает, однако, поскольку представление контента будет иметь неизвестную высоту, смещение 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)

        }
    }
}

1 Ответ

1 голос
/ 10 января 2020

Здесь возможен подход для считывания content высоты непосредственно с нее во время выравнивания ...

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)

        }
    }
}
...