#swift #swiftui #swiftui-scrollview
Вопрос:
Я построил контейнер для чипов на основе этой ссылки. В основном это просто контейнер, который заказывает фишки рядами. Это мой код:
struct ChipsContent: View {
@ObservedObject var viewModel = ChipsViewModel()
@State private var totalHeight
= CGFloat.zero
var body: some View {
var width = CGFloat.zero
var height = CGFloat.zero
return ScrollView {
GeometryReader { geo in
ZStack(alignment: .topLeading, content: {
ForEach(viewModel.dataObject) { chipsData in
Chips(systemImage: chipsData.systemImage,
titleKey: chipsData.titleKey,
isSelected: chipsData.isSelected)
.padding(.all, 5)
.alignmentGuide(.leading) { dimension in
if (abs(width - dimension.width) > geo.size.width) {
width = 0
height -= dimension.height
}
let result = width
if chipsData.id == viewModel.dataObject.last!.id {
width = 0
} else {
width -= dimension.width
}
return result
}
.alignmentGuide(.top) { dimension in
let result = height
if chipsData.id == viewModel.dataObject.last!.id {
height = 0
}
return result
}
}
}).background(viewHeightReader($totalHeight))
}.padding(.all, 5)
}.frame(height: height)
}
private func viewHeightReader(_ binding: Binding<CGFloat>) -> some View {
return GeometryReader { geometry -> Color in
let rect = geometry.frame(in: .local)
DispatchQueue.main.async {
binding.wrappedValue = rect.size.height
}
return .clear
}
}
}
С помощью этого кода контейнер получает высоту в соответствии с его содержимым. Я хочу установить максимальную высоту для представления прокрутки, и если содержимое превышает эту максимальную высоту, содержимое должно быть прокручиваемым. Возможно ли это сделать?
Ответ №1:
Используйте .кадр(минимальная высота: …, максимальная высота: …)
Установив минимальную и максимальную высоту, вы ограничиваете свободу SwiftUI в выборе размера, поэтому у вас больше контроля по сравнению с простым упоминанием .рамка(высота:…), которая рассматривается как рекомендация, но не значение, которое необходимо учитывать.