我正在使用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.并显式减轻它。
还尝试根据设备 方向来使偏移量无效并进行处理(可能不理想,但作为第一次尝试),因为它们是 不同的。
在此处输入图片说明 在此处输入图片说明
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)) } } }