Lorsque vous placez une étiquette multiligne (avec un saut de ligne défini sur Word Wrap) dans une vue de pile, l'étiquette perd immédiatement le saut de ligne et affiche le texte de l'étiquette sur une ligne à la place.
Pourquoi cela se produit-il et comment conserver une étiquette multiligne dans une vue de pile?
Réponses:
La bonne réponse est ici:
https://stackoverflow.com/a/43110590/566360
UILabel
intérieur d'unUIView
(Éditeur -> Intégrer dans -> Afficher)UILabel
àUIView
(par exemple, espace de fin, espace supérieur et espace de début pour superviser les contraintes)Le
UIStackView
va étirer leUIView
pour s'adapter correctement, et leUIView
contraindraUILabel
à plusieurs lignes.la source
UIView
manigance nécessaire.Pour une vue de pile horizontale qui a une
UILabel
comme l'une de ses vues, dans Interface Builder d'abord définilabel.numberOfLines = 0
. Cela devrait permettre à l'étiquette d'avoir plus d'une ligne. Cela n'a pas fonctionné initialement pour moi lorsque la vue de la pile avaitstackView.alignment = .fill
. Pour le faire fonctionner, il suffit de définirstackView.alignment = .center
. L'étiquette peut désormais s'étendre sur plusieurs lignes dans leUIStackView
.La documentation Apple dit
Notez le mot sauf ici. Quand
.fill
est utilisé, l'horizontaleUIStackView
ne se redimensionne PAS verticalement en utilisant les tailles de sous-vues arrangées.la source
.alignment
de l'UIStackView que vous devez définir sur n'importe quoi, mais.fill
pas sur UILabel, ce qui est un peu déroutant dans l'exemple donnélabel.alignment = .center
. Je pense que cela devrait êtrestackView.alignment = .center
multiLine
moins que vous ne lui donniez une largeur fixe. Lorsque nous fixons sa largeur, il passe en multiligne lorsque cette largeur est atteinte, comme indiqué:Si nous ne donnons pas une largeur fixe à la vue de la pile, les choses deviennent ambiguës. Combien de temps la vue de la pile augmentera-t-elle avec l'étiquette (si la valeur de l'étiquette est dynamique)?
J'espère que cela peut résoudre votre problème.
la source
preferredMaxLayoutWidth
dansviewDidLayoutSubviews
pour votre étiquette dansUIViewController
ou danslayoutSubviews
si vous sous-classeUIView
.La définition de PreferredMaxLayoutWidth sur UILabel a fonctionné pour moi
la source
.center
et je n'avais vraiment pas besoin de mon étiquette dans UIView.Définissez simplement le nombre de lignes sur 0 dans l'inspecteur d'attributs pour l'étiquette. Cela fonctionnera pour vous.
la source
Après avoir essayé toutes les suggestions ci-dessus, je n'ai trouvé aucun changement de propriétés nécessaire pour UIStackView. Je change juste les propriétés des UILabels comme suit (les étiquettes sont déjà ajoutées à une vue de pile verticale):
Exemple Swift 4:
la source
L'astuce magique pour moi était de mettre un
widthAnchor
auUIStackView
.Le réglage
leadingAnchor
ettrailingAnchor
ne fonctionnera pas, mais le réglagecenterXAnchor
etwidthAnchor
l'affichage de UILabel correctement.la source
iOS 9+
Appelez
[textLabel sizeToFit]
après avoir défini le texte de l'UILabel.sizeToFit remettra en page l'étiquette multiligne à l'aide de la méthode favoriteMaxWidth. L'étiquette redimensionnera le stackView, ce qui redimensionnera la cellule. Aucune contrainte supplémentaire en plus d'épingler la vue de pile à la vue de contenu n'est requise.
la source
Voici un exemple complet d'une verticale
UIStackView
composée de multilignesUILabel
avec hauteur automatique.Les étiquettes sont enveloppées en fonction de la largeur de la vue de pile et la hauteur de la vue de la pile est basée sur la hauteur enveloppée de l'étiquette. (Avec cette approche, vous n'avez pas besoin d'incorporer les étiquettes dans a
UIView
.) (Swift 5, iOS 12.2)Voici un exemple
ViewController
qui l'utilise.la source
Ajouter des
UIStackView
propriétés,Au lieu d'ajouter une étiquette à l'intérieur
UIView
qui n'est pas nécessaire.Si vous l'utilisez à l'intérieurUITableViewCell
, rechargez les données lors de la rotation.la source
Ce qui suit est une implémentation Playground d'une étiquette multiligne avec un saut de ligne à l'intérieur d'un
UIStackView
. Il ne nécessite pas d'incorporerUILabel
quoi que ce soit à l' intérieur et a été testé avec Xcode 9.2 et Swift 4. J'espère que cela sera utile.la source
La mise en page du système doit déterminer l'origine, la largeur et la hauteur pour dessiner les sous-vues, dans ce cas toutes vos sous-vues ont la même priorité, ce point crée un conflit, le système de mise en page ne connaît pas les dépendances entre les vues, que l'on dessine en premier, en deuxième et ainsi de suite
Définir la compression des sous-vues de pile résoudra le problème avec plusieurs lignes, selon que votre vue de pile est horizontale ou verticale et que vous voulez devenir plusieurs lignes.
stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
la source
Dans mon cas, j'ai suivi les suggestions précédentes, mais mon texte était toujours tronqué en une seule ligne, mais uniquement en paysage. Il s'avère que j'ai trouvé un
\0
caractère nul invisible dans le texte de l'étiquette qui était le coupable. Il doit avoir été introduit à côté du symbole de tiret em que j'avais inséré. Pour voir si cela se produit également dans votre cas, utilisez le débogueur de vue pour sélectionner votre étiquette et inspecter son texte.la source
Xcode 9.2:
Définissez simplement le nombre de lignes sur 0. Storyboard aura l'air bizarre après avoir défini cela. Ne vous inquiétez pas, exécutez le projet. Lors de l'exécution, tout sera redimensionné en fonction de la configuration de votre storyboard. Je pense que c'est une sorte de bug dans le storyboard.
Astuces: Réglez le "nombre de doublure à 0" dans le dernier. réinitialisez-le lorsque vous souhaitez modifier une autre vue et réglez-le sur 0 après la modification.
la source
Qu'est-ce qui a fonctionné pour moi!
stackview: alignement: remplissage, distribution: remplissage, contrainte largeur proportionnelle à superview ex. 0,8,
label: centre et lignes = 0
la source
Pour tous ceux qui ne peuvent toujours pas le faire fonctionner. Essayez de définir la réduction automatique avec une échelle de police minimale sur cet UILabel.
Capture d'écran Paramètres UILabel Autoshrink
la source
C'est presque comme la réponse de @ Andy, mais vous pouvez ajouter votre
UILabel
en plusUIStackview
, verticalement travaillé pour moi.la source
Pour moi, le problème était que la hauteur de la vue de la pile était tout simplement trop courte. L'étiquette et la vue de la pile ont été correctement configurées pour permettre à l'étiquette d'avoir plusieurs lignes, mais l'étiquette a été la première victime de la compression de contenu utilisée par la vue de la pile pour obtenir une hauteur suffisamment petite.
la source