我使用多向滚动视图创建了一个类似 excel 的视图。现在我想固定标题,不仅是列标题,还有行标题。看下面的 gif:
我用来创建此视图的代码:
ScrollView([.vertical, .horizontal]){
VStack(spacing: 0){
ForEach(0..<model.rows.count+1, id: \.self) {rowIndex in
HStack(spacing: 0) {
ForEach(0..<model.columns.count+1) { columnIndex in
if rowIndex == 0 && columnIndex == 0 {
Rectangle()
.fill(Color(UIColor(Color.white).withAlphaComponent(0.0)))
.frame(width: CGFloat(200).pixelsToPoints(), height: CGFloat(100).pixelsToPoints())
.padding([.leading, .trailing])
.border(width: 1, edges: [.bottom, .trailing], color: .blue)
} else if (rowIndex == 0 && columnIndex > 0) {
TitleText(
label: model.columns[columnIndex - 1].label,
columnWidth: CGFloat(columnWidth).pixelsToPoints(),
borderEgdes: [.top, .trailing, .bottom]
)
} else if (rowIndex > 0 && columnIndex == 0) {
TitleText(
label: model.rows[rowIndex - 1].label,
columnWidth: CGFloat(columnWidth).pixelsToPoints(),
borderEgdes: [.trailing, .bottom, .leading]
)
} else if (rowIndex > 0){
//text boxes
let column = model.columns[columnIndex - 1]
switch column.type {
case "Text":
MatrixTextField(keyboardType: .default)
case "Number":
MatrixTextField(keyboardType: .decimalPad)
case "RadioButton":
RadioButton()
case "Checkbox":
MatrixCheckbox()
default:
MatrixTextField(keyboardType: .default)
}
}
}
}
}
}
}
.frame(maxHeight: 500)
是否可以在此处固定列标题和行标题?
重要的是我只使用 VStack 和 HStack 而不是 LazyVStack 和 LazyHStack,因为我在滚动时需要平滑度,当我使用 Lazy 堆栈时,它会因为明显的原因而抖动很多。所以不能在这里真正使用节标题。
我还能遵循什么其他方法?