Текст «Нижний текст» должен занимать некоторое место внизу. Однако при использовании LazyVGrid с представлением прокрутки содержимое в конечном итоге отображается за нижним текстом, и кажется, что прокручиваемая область выходит за пределы экрана.
Как решить эту проблему?
Ожидал
Действительный
struct HFlexibleView<Content: View>: View {
let triggerWidth: CGFloat
let content: () -> Content
///If this is set true, the view will be rendered normally, insead of being arranged flexibly
var disabled: Bool
var maxmumWidth: CGFloat
var columns: [GridItem] {
[GridItem(.adaptive(minimum: triggerWidth,
maximum: maxmumWidth))]
}
init(triggerWidth: CGFloat,
maxmumWidth: CGFloat = .infinity,
disabled: Bool = false,
@ViewBuilder content: @escaping () -> Content) {
self.triggerWidth = triggerWidth
self.maxmumWidth = maxmumWidth
self.disabled = disabled
self.content = content
}
var body: some View {
if disabled {
content()
} else {
GeometryReader { geometry in
LazyVGrid(columns: columns) {
content()
.frame(maxWidth: .infinity)
}
}
}
}
}
struct FlexbibleView_Previews: PreviewProvider {
static var previews: some View {
VStack {
HFlexibleView(triggerWidth: 500) {
ScrollView {
ForEach(0...20, id: \.self) {_ in
Image(systemName: "keyboard")
.font(.system(size: 30))
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 50)
.background(Color.green)
.cornerRadius(10)
}
}
}
Text("Bottom Text")
}
}
}





В документах для LazyVGrid говорится: Контейнерное представление, которое упорядочивает свои дочерние представления в сетке, которая растет вертикально, создавая элементы только по мере необходимости.
Таким образом, вы можете использовать определенный размер для ограничения content (то есть ScrollView), например:
GeometryReader { geometry in
LazyVGrid(columns: columns) {
content()
.frame(maxWidth: .infinity, maxHeight: geometry.size.height)
}
}