J'ai quelques étiquettes dont je veux ajuster leur hauteur au texte, c'est le code que j'ai écrit pour cela maintenant
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
ÉDITER:
Le problème n'était pas dans ce morceau de code, donc mon correctif est dans la question elle-même. Cela pourrait encore être utile pour les autres!
sizeWithFont
n'est peut-être pas disponible pour SwiftString
mais il est disponible surNSString
Vous devriez toujours pouvoir l'appeler là-dessus.Réponses:
Je viens de mettre ça dans une cour de récréation et ça marche pour moi.
Mis à jour pour Swift 4.0
Swift 3:
la source
UILabel
par dimensionnement; si cette méthode est utilisée à l'intérieurlayoutSubviews
avec la tendance à être invoquée plusieurs fois par mise en page complète, la création d'objet supplémentaire peut introduire des retards notables, en particulier lors du défilement.Si vous utilisez la mise en page automatique , vous pouvez ajuster
UILabel
hauteur uniquement en configurant l'interface utilisateur.Pour iOS8 ou supérieur
UILabel
UILabel
1 à 0Pour iOS7
UILabel
Equal
àGreater than or Equal
UILabel
1 à 0Vous
UILabel
augmenterez automatiquement la hauteur en fonction du textela source
Je crée cette extension si vous le souhaitez
la source
J'ai une solution de travail solide.
dans la mise en page
dans le setter de texte:
UPD. bien sûr avec ces paramètres UILabel:
la source
Juste en réglant:
L'étiquette ajuste automatiquement sa hauteur en fonction de la quantité de texte saisie.
la source
basé sur la réponse d'Anorak, je suis également d'accord avec l'inquiétude de Zorayr, j'ai donc ajouté quelques lignes pour supprimer l'UILabel et renvoyer uniquement le CGFloat, je ne sais pas si cela aide car le code d'origine n'ajoute pas le UIabel, mais il ne lance pas d'erreur, j'utilise donc le code ci-dessous:
la source
Dans Swift 4.1 et Xcode 9.4.1
Seulement 3 étapes
Étape 1)
Étape 2)
Étape 3)
la source
La solution proposée par Anorak comme propriété calculée dans une extension pour UILabel:
Usage:
la source
Suite à la réponse @Anorak, j'ai ajouté cette extension à String et envoyé un encart en tant que paramètre, car vous aurez souvent besoin d'un remplissage dans votre texte. Quoi qu'il en soit, peut-être que certains trouveront cela utile.
la source
Voici comment calculer la hauteur du texte dans Swift. Vous pouvez ensuite obtenir la hauteur du rect et définir la hauteur de contrainte de l'étiquette ou du textView, etc.
la source
appelez simplement cette méthode où vous avez besoin d'une hauteur dynamique pour l'étiquette
la source
Swift 4.0
self.messageLabel = UILabel (cadre: CGRect (x: 70, y: 60, largeur: UIScreen.main.bounds.width - 80, hauteur: 30)
Ce lien décrit la façon dont le storyboard fait de même
la source
Swift 4.0
Au lieu de calculer la hauteur du texte / étiquette, je redimensionne simplement l'étiquette après avoir inséré le texte (dynamique).
En supposant que myLabel est le UILabel en question:
Et maintenant vient la partie amusante:
la source
La méthode d'extension Swift 4.1 pour calculer la hauteur de l'étiquette:
la source
Swift 5, manière de storyboard XCode 11. Je pense que cela fonctionne pour iOS 9 et supérieur. Vous voulez par exemple que le libellé "Description" obtienne la hauteur dynamique, suivez les étapes:
1) Sélectionnez l'étiquette de description -> Accédez à l'inspecteur d'attributs (icône de crayon), définissez: Lignes: 0 Saut de ligne: Retour à la ligne
2) Sélectionnez votre UILabel dans le storyboard et accédez à l'inspecteur de taille (icône de règle), 3) Descendez à «Priorité de résistance à la compression du contenu à 1 pour tous les autres composants UIView (étiquettes, boutons, imageview, etc.) qui interagissent avec votre étiquette.
Par exemple, j'ai dans ma vue UIImageView, Title Label et Description Label verticalement. J'ai défini la priorité de résistance à la compression du contenu sur UIImageView et l'étiquette de titre sur 1 et pour l'étiquette de description sur 750. Cela fera qu'une étiquette de description prenne autant de hauteur que nécessaire.
la source
Pour rendre l'étiquette dynamique dans Swift, ne donnez pas de constarint de hauteur et dans le storyboard, le nombre de lignes de l'étiquette 0 donne également une contrainte de fond et c'est la meilleure façon de gérer l'étiquette dynamique en fonction de la taille de leur contenu.
la source
Vous pouvez aussi utiliser
sizeThatFits
fonction.Par exemple:
label.sizeThatFits(superView.frame.size).height
la source