SwiftUI Como alinhar uma visualização maior que a largura da tela

Berkabbasoglu

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.

Captura de tela de exemplo

Temperamento dele

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 ScrollVieweixo, 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 GeometryReaderrecá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.

insira a descrição da imagem aqui insira a descrição da imagem aqui

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.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como encontrar o maior tamanho de uma visualização que não torne a janela maior que o tamanho da tela?

Como parar o evento de clique ao redimensionar e carregar se a largura da tela for maior que?

A largura 100% é maior que o tamanho da tela

A largura 100% é maior que o tamanho da tela

Como fazer div alinhar em uma linha mesmo que o tamanho da tela seja pequeno

Como fazer div alinhar em uma linha mesmo que o tamanho da tela seja pequeno

python Tkinter: como impedir que uma janela se torne maior do que o tamanho da tela

Como fazer o contêiner não ficar maior que a visualização da tela

ConstraintLayout: como ter uma visualização com metade da largura da tela e centralizada?

Como fazer o VStack preencher a largura da tela no SwiftUI

Como fazer o VStack preencher a largura da tela no SwiftUI

Como faço para que uma grade filha tenha largura de tela inteira, independentemente da grade?

Como alinhar div ao centro quando o tamanho do div adjacente ultrapassa a largura da tela

JavaScript executa o script quando a largura da tela é <480 e não quando é maior que> 480?

Por que essa imagem com largura de 100% é maior do que a largura da tela * proporção de pixels do dispositivo

Como redimensionar a largura da tela na janela de visualização

Largura do elemento de borda maior do que a largura da tela no menor tamanho de tela

Largura do elemento de borda maior do que a largura da tela no menor tamanho de tela

Como adiciono uma visualização de rolagem a uma parte específica da tela no SwiftUI?

Como adiciono uma visualização de rolagem a uma parte específica da tela no SwiftUI?

KineticJS: Como posso editar uma imagem que é muito maior do que o tamanho da minha tela / palco sem perder qualidade?

Como posso fazer uma linha que tem 100% da largura do pai com 2 filhos onde o segundo filho está posicionado no centro da largura da tela

SwiftUI: como alinhar o conteúdo ao topo da tela, mas manter o botão Voltar

A largura do conteúdo do site responsivo é maior do que a largura da porta de visualização

Como faço para que minha mesa mantenha uma certa largura quando o tamanho da tela está diminuindo?

Como detectar que uma determinada visualização está sendo exibida na tela no SwiftUI

WPF: como centralizar textBlock na coluna da grade se o texto for maior que a largura da linha

Centralizar uma visualização fora da tela do SwiftUI

Como a vibração calcula a largura da tela