Essa provavelmente é uma pergunta simples, mas estou com muita dificuldade.
Vamos supor que eu tenha o seguinte Layout de Visualização no SwiftUI
Quero que a String de Data 10.5.2020
seja alinhada à direita no VStack pai.
Mas é importante que, ao fazer isso, o tamanho intrínseco do VStack não seja quebrado.
Estou dizendo isso porque as duas soluções mais óbvias estão fazendo isso.
- Cerque com
HStack
e coloque umSpacer
à esquerda. - Use quadro com
maxWidth: .infinity
ealignment: .trailing
Dei uma olhada mais aprofundada nos guias de alinhamento, mas não consegui consertar com isso.
Meus melhores resultados até agora foram com GeometryReader
, definindo a largura do rótulo de texto quase igual à largura do VStack circundante.
Mas infelizmente minha estrutura de alvo é muito mais complexa e essa abordagem leva a problemas nessa estrutura. Também GeometryReader
parece inapropriado fazer alinhamento.
struct ContentView: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
HStack {
VStack(alignment: .leading) {
Text("Alignment Test")
Text("This is a longer text left aligned")
Text("10.5.2020")
}
.padding(16)
.background(Color.blue)
Spacer(minLength: 50)
}
HStack {
VStack(alignment: .leading) {
Text("left")
Text("Date should rigzht align to here <-")
Text("10.5.2020")
}
.padding(16)
.background(Color.blue)
Spacer(minLength: 50)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.border(.red)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.gray.opacity(0.5))
}
}
Prévias:
O alinhamento pode ser obtido usando uma combinação de modificadores
.frame
e ..fixedSize
.frame(maxWidth: .infinity, alignment: .trailing)
ao(s) texto(s) que você quer alinhado(s) à direita. Isso faz com que o texto se estenda até a largura máxima disponível, com o conteúdo alinhado à direita.Normalmente, isso faria com que o contêiner se estendesse para a largura total disponível também. Então, para evitar que isso aconteça:
.fixedWidth()
aoVStack
. Isso diz para ele adotar a largura ideal de seu conteúdo.Então, o modo como funciona é que o
VStack
é dimensionado para a largura ideal do seu conteúdo e, dentro dessa restrição, omaxWidth: .infinity
no texto entra em vigor.EDIT Em um comentário, você disse que o texto mais longo pode ser tão longo que precisará ser quebrado. Mas aplicar
.fixedSize()
impedirá o quebra.Como uma abordagem alternativa, você pode considerar usar uma coluna única
Grid
:VStack
porGrid
..gridCellAnchor(.trailing)
as datas.Encontrei uma solução alternativa que não é tão elegante quanto a que usa
Grid
, mas está funcionando mesmo assim e quero documentá-la aqui. Por exemplo, o Grid não está disponível antes do iOS 16 e você pode precisar dar suporte a esses dispositivos em produção.Nessa abordagem, estou usando sobreposições com
bottomTrailing
alinhamento para adicionar o texto da data.Note que eu mantenho o texto da data no original
VStack
para ocupar o Espaço lá. Com oforegroundStyle = .clear
estou escondendo esse texto espaçador para que ele não seja mostrado na IU.A desvantagem dessa abordagem é que ela só funciona quando você deseja adicionar seu rótulo no canto inferior direito.