Multi-étiquette en UIStackView
Lors de la mise en multiligne étiquette (avec saut de ligne jeu de Mot à la ligne) dans une pile de vue, l'étiquette perd immédiatement le saut de ligne et affiche le texte de l'étiquette dans une ligne à la place.
Pourquoi est-ce qui se passe et comment préserver plusieurs lignes de l'étiquette à l'intérieur d'une pile de vue?
- Avez-vous définissez le nombre de lignes à 0?
- Avez-vous trouver la réponse?
Vous devez vous connecter pour publier un commentaire.
La bonne réponse est ici: https://stackoverflow.com/a/43110590/566360
UILabel
à l'intérieur d'unUIView
(Éditeur -> Intégrer Dans -> View)UILabel
à laUIView
(par exemple, l'espace arrière, en haut de l'espace, et l'espace à gauche pour superview contraintes)La
UIStackView
va étirer leUIView
pour s'adapter correctement, et leUIView
va limiter laUILabel
à plusieurs lignes.hidden
bien sur laUIStackView
en question. Il semble forcer un recalcul de la mise en page des attributs.UILabel
dans unUIView
+ réglage de laUIStackView's
alignement horizontal de centre suis-moi sur la ligne d'arrivéeUIView
manigances nécessaire.UIStackView
contient 2 multiligne étiquettes et 2 images.UIStackView
sous-vue de contraintes pour l'alignement comme: chef de file, derrière, en haut, en bas. LeUIStackView
est responsable de cette déjà (il traite disposées sous des vues et des alignements d'espacement). Si vous voulez plus fine de contrôle du positionnement, de l'ajouter à votreUILabel
à un mannequin transparentUIView
puis de définir le positionnement des contraintes de là.Pour une horizontale vue de la pile qui a une
UILabel
comme l'un de ses points de vue, dans Interface Builder tout d'abord définirlabel.numberOfLines = 0
. Cela devrait permettre à l'étiquette pour avoir plus de 1 ligne. Cette initialement ne fonctionne pas pour moi, quand la pile astackView.alignment = .fill
. Pour le faire fonctionner simplement misstackView.alignment = .center
. L'étiquette peut maintenant étendre sur plusieurs lignes à l'intérieur de laUIStackView
.La La documentation d'Apple dit
Note le mot sauf ici. Lorsque
.fill
est utilisé à l'horizontaleUIStackView
ne PAS redimensionner lui-même verticalement à l'aide de la organisés des sous-vues tailles..center
alignement, rien outre.fill
devrait fonctionner.alignment
de la UIStackView que vous avez à régler pour quelque chose, mais.fill
pas le UILabel, ce qui est un peu déroutant dans l'exemple donnélabel.alignment = .center
. Je pense que cela devrait êtrestackView.alignment = .center
.center
, mon labelnumberOfLines
est0
, mais il ne montre que 2 lignes et pas le reste. Cette solution ne pas montrer quelque chose au sujet de la compression ou l'étreindre la résistance, peut-être?.fillProportionally
multiLine
, sauf si vous lui donner une largeur fixe. Lorsque nous fixer sa largeur puis il pause multiligne lorsque que la largeur est atteint comme le montre:Si nous n'avons pas de donner une largeur fixe à la vue de la pile puis les choses se ambiguë. Combien de temps la pile de vue grandir avec l'étiquette (si la valeur de l'étiquette dynamique)?
J'espère que cela peut résoudre votre problème.
preferredMaxLayoutWidth
dansviewDidLayoutSubviews
pour votre étiquetteUIViewController
ou danslayoutSubviews
si vous sous-classeUIView
.Juste de définir le nombre de lignes à 0 dans l'Attribut de l'inspecteur pour l'étiquette. Il va travailler pour vous.
Réglage preferredMaxLayoutWidth à la UILabel a fonctionné pour moi
Ce qui suit est une aire de Jeux la mise en œuvre de multi-étiquette de ligne avec un saut de ligne à l'intérieur d'un
UIStackView
. Il ne nécessite pas l'intégration de laUILabel
à l'intérieur de n'importe quoi et a été testé avec Xcode 9.2 et Swift 4. J'espère que c'est utile.iOS 9+
Appel
[textLabel sizeToFit]
après le réglage de la UILabel du texte.sizeToFit re-mise en page multi-étiquette en utilisant preferredMaxWidth. Le label permettra de redimensionner la empilervoir, qui permettra de redimensionner la cellule. Pas de contraintes supplémentaires, en plus de l'épinglage de la pile en vue de l'affichage du contenu sont nécessaires.
Ajouter
UIStackView
propriétés,Au lieu de l'ajout de l'étiquette à l'intérieur de
UIView
qui n'est pas nécessaire.Si vous utilisez à l'intérieur deUITableViewCell
s'il vous plaît, recharger les données sur la rotation.Le tour de magie pour moi a été de définir un
widthAnchor
à laUIStackView
.Réglage
leadingAnchor
ettrailingAnchor
ne fonctionne pas, mais la mise encenterXAnchor
etwidthAnchor
fait le UILabel afficher correctement.Système de mise en page doit comprendre l'origine, la largeur et la hauteur de la dessiner sous-vues, dans ce cas, tous vos sous-vues a la même priorité que le point de faire conflit, système de mise en page n'est pas connu des dépendances entre les vues, un tirage de première, de deuxième et ainsi de suite
Ensemble de la pile des sous-vues de compression permettra de résoudre le problème avec plusieurs ligne, en fonction de votre vue de la pile est à l'horizontale ou à la verticale et que vous souhaitez devenir plusieurs lignes.
stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Après avoir essayé tous les ci-dessus suggestion je n'ai pas trouvé de modification des propriétés de la UIStackView. Je viens de changer les propriétés de la UILabels comme suit (Les étiquettes sont ajoutées à une pile verticale de vue déjà):
Swift 4 exemple:
Voici un exemple complet d'une verticale
UIStackView
composé de plusieurs lignesUILabel
s avec automatique de la hauteur.Les étiquettes encapsuler, basée sur le empilervoir de la largeur et de la empilervoir sa hauteur est fondée sur l'étiquette placé en hauteur. (Avec cette approche, vous n'avez pas à intégrer les étiquettes dans un
UIView
.) (Swift 5, iOS 12.2)Voici un exemple de
ViewController
qui l'utilise.Dans mon cas, j'ai suivi les suggestions précédentes, mais mon texte était encore en train tronqué à une seule ligne mais uniquement en mode paysage. S'avère, j'ai trouvé un invisible
\0
caractère null dans le texte de l'étiquette qui était le coupable. Il doit avoir été introduite en même temps que le tiret cadratin symbole que j'avais inséré. Pour voir si c'est également votre cas, utiliser le Débogueur pour sélectionner votre étiquette et d'inspecter son texte.Xcode 9.2:
Juste de définir le nombre de lignes à 0. Storyboard aura l'air bizarre après la définition de cette. Ne vous inquiétez pas exécuter le projet. Lors de l'exécution de tout redimensionner en fonction de votre scénario de l'installation. Je pense que ce genre de bug dans le storyboard.
Conseils : Set "nombre de liner à 0" dans la dernière. réinitialiser lorsque vous souhaitez modifier quelques autres, et la valeur 0 après le montage.
Ce qui a fonctionné pour moi!
empilervoir: alignement: remplissage, de la distribution: remplir, contrainte de largeur proportionnelle à superview ex. 0.8,
étiquette: centre, et les lignes = 0
Pour quelqu'un qui ne peuvent pas encore le faire fonctionner. Essayez de mettre de la réduction automatique avec un minimum de Police de l'Échelle sur que UILabel.
Capture d'écran UILabel de réduction automatique des paramètres