我正在使用SwiftUI绘制表格,表格中的行和列太多,无法容纳屏幕的宽度/高度。在这种情况下,我无法将视图对齐为领先,但总是以某种方式居中。我该如何调整他们的领先地位?这是绘制表格的视图:
struct TableView: View {
let columnCount: Int = 9
let rowCount: Int = 14
var body: some View {
VStack(alignment: .leading, spacing: 20) {
ScrollView([.vertical, .horizontal], showsIndicators: false) {
GridStack(rows: self.rowCount, columns: self.columnCount) { row, col in
Text("ROW \(String(row)) COL \(String(col))")
.frame(width: 120)
}
}
}
}
}
这是GridStack:
struct GridStack<Content: View>: View {
let rows: Int
let columns: Int
let content: (Int, Int) -> Content
var body: some View {
VStack(alignment: .leading) {
ForEach(0 ..< rows) { row in
HStack(alignment: .top) {
ForEach(0 ..< self.columns) { column in
self.content(row, column)
}
}
}
}
.padding([.top, .bottom], 20)
}
init(rows: Int, columns: Int, @ViewBuilder content: @escaping (Int, Int) -> Content) {
self.rows = rows
self.columns = columns
self.content = content
}
}
这是应用程序中的外观。请注意,边缘不适合放入屏幕。即使我尝试滚动到那里,它也会反弹回来。
这里是可能方法的演示(以及改进的方向,因为我没有测试所有情况和可能性)
注:如果仅选择一个ScrollView
轴,它将自动进行内容对齐,否则我现在感到困惑,但是没有配置功能。因此,以下可能被视为临时解决方法。
想法是通过GeometryReader
坐标空间中的帧的.global.
重新计算来读取网格内容偏移,并显式减轻它。
还尝试根据设备的方向使偏移量无效并处理偏移量(可能不理想,但作为首次尝试),因为它们是不同的。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS90dGxJSy5wbmcifQ==” alt =“在此处输入图像描述”>
import Combine
struct TableView: View {
let columnCount: Int = 9
let rowCount: Int = 14
@State private var offset: CGFloat = .zero
private let orientationPublisher = NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)
var body: some View {
VStack(alignment: .leading, spacing: 20) {
ScrollView([.horizontal, .vertical], showsIndicators: false) {
GridStack(rows: self.rowCount, columns: self.columnCount) { row, col in
Text("ROW \(String(row)) COL \(String(col))")
.fixedSize()
.frame(width: 150)
}
.background(rectReader())
.offset(x: offset)
}
}
.onReceive(orientationPublisher) { _ in
self.offset = .zero
}
}
func rectReader() -> some View {
return GeometryReader { (geometry) -> AnyView in
let offset = -geometry.frame(in: .global).minX
if self.offset == .zero {
DispatchQueue.main.async {
self.offset = offset
}
}
return AnyView(Rectangle().fill(Color.clear))
}
}
}