Сделать лист точного размера содержимого внутри

Скажем, у меня есть собственный вид внутри листа, что-то вроде этого

      VStack {
   Text("Title")
   Text("Some very long text ...")
}
.padding()
.presentationDetents([.height(250)])

Как мне получить точную высоту VStack и передать ее модификатору PresentationDetents, чтобы высота листа была точно равна высоте содержимого внутри?

1 ответ

1. Создайте модификатор Custom, который возвращает высоту любого вида (это очень полезный модификатор, который вы, скорее всего, будете использовать где-нибудь еще):

      struct GetHeightModifier: ViewModifier {
    @Binding var height: CGFloat

    func body(content: Content) -> some View {
        content.background(
            GeometryReader { geo -> Color in
                DispatchQueue.main.async {
                    height = geo.size.height
                }
                return Color.clear
            }
        )
    }
}

2. Используйте пользовательский модификатор, чтобы получить высоту.

      struct ContentView: View {
    @State private var showSheet = false
    @State private var sheetHeight: CGFloat = .zero

    var body: some View {
        Button("Open sheet") {
            showSheet = true
        }
        .sheet(isPresented: $showSheet) {
            VStack {
                Text("Title")
                Text("Some very long text ...")
            }
            .padding()
            .modifier(GetHeightModifier(height: $sheetHeight))
            .presentationDetents([.height(sheetHeight)])
        }
    }
}

Другие вопросы по тегам