308 votes

Alignement du texte de SwiftUI

Parmi les nombreuses propriétés de la Text Je n'ai trouvé aucune information relative à l'alignement du texte. J'ai vu dans une démo qu'il gère automatiquement le RTL, et lorsque l'on place des éléments en utilisant la vue body il le centre toujours automatiquement.

Est-ce qu'il y a un concept qui m'échappe concernant le système de mise en page dans SwiftUI et si ce n'est pas le cas, comment puis-je définir les propriétés d'alignement du texte à l'aide de l'option Text ?

482voto

vrwim Points 3800

Vous pouvez le faire via le modificateur .multilineTextAlignment(.center) .

Documentation Apple

17 votes

Existe-t-il quelque chose pour justifier le texte ?

339voto

Jim Marquardt Points 1712

Depuis la version bêta 3 de SwiftUI, vous pouvez centrer une vue de texte avec le modificateur de cadre :

Text("Centered")
    .frame(maxWidth: .infinity, alignment: .center)

2 votes

C'est la meilleure solution !

221voto

staticVoidMan Points 10367

J'essayais de comprendre moi-même ce que d'autres réponses mentionnent ici. Text.multilineTextAlignment(_:) / VStack(alignment:) / frame(width:alignment:) mais chaque solution résout un problème spécifique. En fin de compte, cela dépend des exigences de l'interface utilisateur et d'une combinaison de celles-ci.


VStack(alignment:)

El alignment ici, il s'agit des vues intérieures respectives des uns et des autres.
Ainsi, en spécifiant .leading associerait tous les points de vue intérieurs pour qu'ils soient alignés les uns avec les autres.

VStack(alignment: .leading, spacing: 6) {
  Text("Lorem ipsum dolor")
        .background(Color.gray.opacity(0.2))
  Text("sit amet")
        .background(Color.gray.opacity(0.2))
}
.background(Color.gray.opacity(0.1))

image


.frame

En frame(width:alignment:) ou frame(maxWidth:alignment:) le alignment est pour le contenu dans la largeur donnée.

VStack(alignment: .leading, spacing: 6) {
  Text("Lorem ipsum dolor")
      .background(Color.gray.opacity(0.2))
  Text("sit amet")
      .background(Color.gray.opacity(0.2))
}
.frame(width: 380, alignment: .trailing)
.background(Color.gray.opacity(0.1))

Les vues intérieures sont alignées en tête les unes par rapport aux autres, mais les vues elles-mêmes sont alignées en queue par rapport aux vues intérieures. VStack .

image


.multilineTextAlignment

Ceci spécifie l'alignement du texte à l'intérieur et peut être vu de façon optimale lorsqu'il y a plusieurs lignes, sinon sans une ligne définie frame(width:alignment) la largeur est automatiquement ajustée et est affectée par la valeur par défaut de l'indicateur de largeur. alignment s.

VStack(alignment: .trailing, spacing: 6) {
  Text("0. automatic frame\n+ view at parent's specified alignment\n+ multilineTA not set by default at leading")
    .background(Color.gray.opacity(0.2))
  Text("1. automatic frame\n+ view at parent's specified alignment\n+ multilineTA set to center")
  .multilineTextAlignment(.center)
  .background(Color.gray.opacity(0.2))
  Text("2. automatic frame\n+ view at parent's specified alignment\n+ multilineTA set to trailing")
  .multilineTextAlignment(.trailing)
  .background(Color.gray.opacity(0.2))
}
.frame(width: 380, alignment: .trailing)
.background(Color.gray.opacity(0.1))

image


Essais avec des combinaisons :

VStack(alignment: .trailing, spacing: 6) {
  Text("1. automatic frame, at parent's alignment")
  .background(Color.gray.opacity(0.2))
  Text("2. given full width & leading alignment\n+ multilineTA at default leading")
  .frame(maxWidth: .infinity, alignment: .leading)
  .background(Color.gray.opacity(0.2))
  Text("3. given full width & center alignment\n+ multilineTA at default leading")
  .frame(maxWidth: .infinity, alignment: .center)
  .background(Color.gray.opacity(0.2))
  Text("4. given full width & center alignment\n+ multilineTA set to center")
  .multilineTextAlignment(.center)
  .frame(maxWidth: .infinity, alignment: .center)
  .background(Color.gray.opacity(0.2))
  Text("5. given full width & center alignment\n+ multilineTA set to trailing")
  .multilineTextAlignment(.trailing)
  .frame(maxWidth: .infinity, alignment: .center)
  .background(Color.gray.opacity(0.2))
  Text("6. given full width but no alignment\n+ multilineTA at default leading\n+ leading is based on content, looks odd sometimes as seen here")
  .frame(maxWidth: .infinity)
  .background(Color.gray.opacity(0.2))
}
.frame(width: 380)
.background(Color.gray.opacity(0.1))

image

34voto

Lekyaira Points 311

J'ai en fait rencontré le problème où je devais aligner du texte sur une seule ligne. Voici ce que j'ai trouvé pour fonctionner :

Text("some text")
    .frame(alignment: .leading)

Si vous combinez ce paramètre avec celui de la largeur du cadre, vous pouvez obtenir un bon formatage des blocs de texte pour les étiquettes et autres.

31voto

fredpi Points 1433

Je suppose SwiftUI veut que nous utilisions des enveloppes comme les piles pour de telles choses.

Ainsi, au lieu d'écrire quelque chose comme Text("Hello World").aligned(.leading) les éléments suivants sont encouragés :

VStack(alignment: .leading) {
    Text("Hello World")
}

1 votes

Je ne peux donc pas déposer une étiquette indépendante de la pile ?

0 votes

@inokey Je n'ai pas trouvé de modificateur pour cela en tout cas.

0 votes

Je ne l'ai pas fait non plus. J'ai l'impression qu'il me manque une sorte de concept de base de SUI. Je ne peux même pas déposer la "vue" entre deux choses, et lui donner une couleur, comme s'il n'y avait pas d'objet simple à la Uiview.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X