SWIFTUI Как зафиксировать высоту VStack с помощью геометрии (после отображения VStack)? - PullRequest
0 голосов
/ 01 апреля 2020

Я бы хотел попросить вас о помощи. Я пытаюсь захватить Высота VStack , используя геометрию , а затем на основе этого значения Высота VStack вычислить высоту дочернего элемента (внутри VStack).

Изображение моего текущего представления VStack

Я использовал .frame вне VStack, чтобы заполнить весь экран. Затем я использовал .borde r, чтобы визуально проверить, действительно ли он заполняет экран (работает нормально)

.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: Alignment.topLeading)

Проблема может внутри VStack, высота отображается как GCFloat 734. Даже если размер границы намного больше .

struct BodyView: View {
    @State var stackHeight : CGFloat = 0

    var body: some View {
        GeometryReader { geometry in
            VStack {
                Text("VStack size: \(self.stackHeight)")
                    .bold()
                    .frame(maxWidth: .infinity, alignment: .leading)
                    .padding(.horizontal)
                    .background(Color.green)

            }
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: Alignment.topLeading)
            .onAppear{
                self.stackHeight = geometry.size.height
            }
            .border(Color.purple, width: 5)
        }
    }
}

struct BodyView_Previews: PreviewProvider {
    static var previews: some View {
        BodyView()
    }
}

Как я могу зафиксировать фактический размер VStack, когда он заканчивает загрузку?
Когда я запускаю (onAppear), высота VStack кажется правильной, однако мне нужно, чтобы она была мгновенно захвачена.

1 Ответ

1 голос
/ 01 апреля 2020

Если я понимаю ваши вопросы, вы очень близки - вам просто нужно использовать GeometryProxy type:

import SwiftUI

struct BodyView: View {

    var body: some View {
        GeometryReader { geometry in
            VStack {
                Text("VStack size: \(geometry.size.height)") // no need for state var anymore
                    .bold()
                    .frame(maxWidth: .infinity, alignment: .leading)
                    .padding(.horizontal)
                    .background(Color.green)
            }
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: Alignment.topLeading)
            .border(Color.purple, width: 5)
        }
    }
}

struct BodyView_Previews: PreviewProvider {
    static var previews: some View {
        BodyView()
    }
}

A GeometryReader выложится снова если его размер меняется.

...