SwiftUI расширяет или пересчитывает высоту VStack при расширении дочерних представлений
У меня есть прокрутка, которая содержит «карточки» с информацией о погоде в местах, и карты расширяются, чтобы отображать больше информации при нажатии.
Я должен использовать LegacyScrollView, чтобы нижний лист, охватывающий прокрутку, перетаскивался вниз, когда прокрутка находится вверху.
Я не могу понять, как расширить VStack, когда расширяется одна из карт. Есть ли способ заставить GeometryReader или VStack пересчитать необходимую высоту для хранения всех представлений?
Я начинаю с minHeight, установленного на размер окна, поэтому, когда 1-я карта расширяется, все отображается, но 2 или более выходят за пределы окна LazyVStack и обрезаются.
Если для параметра minHeight в LaxyVStack не установлено значение 0, ячейки расширяются от середины, а их вершины обрезаются. Когда он установлен на 0, ячейки расширяются вниз по желанию.
GeometryReader { proxy in
LegacyScrollView(.vertical, showsIndicators: false) {
Spacer(minLength: 40)
LazyVStack(spacing: 0) {
ForEach(mapsViewModel.placedMarkers, id: \.id) { _placeObject1 in
InfoCell(placeObject: _placeObject1)
.environmentObject(mapsViewModel)
.frame(alignment: .top)
Divider().foregroundColor(.white)
}
}
.cornerRadius(25)
.frame(minHeight: 0, alignment: .top)
}
.onGestureShouldBegin{ pan, scrollView in
scrollView.contentOffset.y > 0 || pan.translation(in: scrollView).y < 0
}
.onScroll{ test in
print(test.contentOffset.y)
}
.padding(.top, 30) //padding for top of list
}
и код ячейки:
struct InfoCell: View {
@StateObject var placeObject: PlaceInfo
@State var expandCell = false
var body: some View {
VStack(alignment: .center, spacing: 0) {
//blahblah
if expandCell {
CellExpanded(placeObject: placeObject, isFirstInList: true)
}
}
.frame(maxWidth: .infinity)
.onTapGesture {
withAnimation { expandCell.toggle() }
}
}
}
и код расширения:
struct InfoCellExpanded: View {
@State var forecast = "Daily"
var placeObject: PlaceInfo
var isFirstInList: Bool
var body: some View {
VStack {
//blah
}
.padding(.horizontal, 10)
.padding(.bottom, 20)
}
}