Сделать лист точного размера содержимого внутри
Скажем, у меня есть собственный вид внутри листа, что-то вроде этого
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)])
}
}
}