Estou desenhando uma tabela usando o SwiftUI que tem muitas linhas e colunas para caber na largura / altura da tela. Nesse caso, não posso alinhar a visualização como guia, mas de alguma forma está sempre centralizado. Como posso alinhá-los na liderança superior? Esta é a visão que desenha a mesa:
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)
}
}
}
}
}
E este é 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
}
}
É assim que parece no aplicativo. Observe que as bordas não cabem dentro da tela. Mesmo se eu tentar rolar até lá, ele simplesmente volta.
Aqui está uma demonstração da abordagem possível (e direção das melhorias, porque não testei todos os casos e possibilidades)
Nota: se você selecionar apenas um ScrollView
eixo, ele faz o alinhamento do conteúdo automaticamente, caso contrário, agora é confuso, mas não tem capacidade para ser configurado. Portanto, a seguir pode ser considerada uma solução temporária.
A ideia é ler o deslocamento do conteúdo da grade por meio do GeometryReader
recálculo do quadro no .global.
espaço de coordenadas e mitigá-lo explicitamente.
Também há uma tentativa de invalidar e controlar o deslocamento dependendo da orientação do dispositivo (provavelmente não é o ideal, mas como uma primeira tentativa), porque eles são diferentes.
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))
}
}
}
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras