Это пользовательское представление, которое выглядит так:
Код: Выделить всё
struct FlowLayoutView: View where Data.Element: Hashable {
let data: Data
let spacing: CGFloat
let content: (Data.Element) -> Content
@State private var elementsSize: [Data.Element: CGSize] = [:]
var body: some View {
VStack(alignment: .center, spacing: spacing) {
let rows = computeRows()
ForEach(rows, id: \.self) { row in
HStack(spacing: spacing) {
ForEach(row, id: \.self) { item in
content(item)
.fixedSize()
.readSize { size in
elementsSize[item] = size
}
}
}
}
}
}
private func computeRows() -> [[Data.Element]] {
var rows: [[Data.Element]] = [[]]
var currentRowWidth: CGFloat = 0
let screenWidth = UIScreen.main.bounds.width - 40 // Adjust for padding
for item in data {
let itemSize = elementsSize[item, default: CGSize(width: 100, height: 1)]
if currentRowWidth + itemSize.width > screenWidth {
rows.append([item])
currentRowWidth = itemSize.width
} else {
rows[rows.count - 1].append(item)
currentRowWidth += itemSize.width + spacing
}
}
return rows
}
}
Мне нужны эффективные обновления, как они находятся в Список Swiftui или Lazyvgrid, которые позволяют эффективно повторно-потоковое использование вместо того, чтобы вычислять строки вручную каждый раз, что приводит к «настройке». С другой стороны, с списком или сеткой у меня нет желаемого внешнего вида (изображение слева), и я имею обычный внешний вид (изображение справа), но, по крайней мере, у меня нет «твика» эффект. < /p>
возможно ли каким -то образом иметь сетку или что -то еще, что не потребовало бы от меня вычисления строк и в то же время иметь вид, как изображение слева (все центрировано ;>
Подробнее здесь: https://stackoverflow.com/questions/794 ... effect-bug