J'essaie de calculer la hauteur d'un UILabel en fonction de différentes longueurs de chaîne.
func calculateContentHeight() -> CGFloat{
var maxLabelSize: CGSize = CGSizeMake(frame.size.width - 48, CGFloat(9999))
var contentNSString = contentText as NSString
var expectedLabelSize = contentNSString.boundingRectWithSize(maxLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(16.0)], context: nil)
print("\(expectedLabelSize)")
return expectedLabelSize.size.height
}
Ci-dessus se trouve la fonction actuelle que j'utilise pour déterminer la hauteur mais cela ne fonctionne pas. J'apprécierais grandement toute aide que je peux obtenir. Je préférerais la réponse en Swift et non en Objective C.
Réponses:
Utiliser une extension sur
String
Swift 3
et aussi sur
NSAttributedString
(ce qui est parfois très utile)Swift 4
Changez simplement la valeur pour
attributes
dans lesextension String
méthodesde
à
la source
[NSFontAttributeName: font, NSLineBreakMode: .ByWordWrapping]
mais cela n'a pas fonctionnéNSParagraphStyleAttributeName : style
où le style est NSMutableParagraphStylesizeForItemAtIndexPath
dans unUICollectionView
est qu'il semble annuler le retour pourinsetForSectionAt
Pour le texte multiligne, cette réponse ne fonctionne pas correctement. Vous pouvez créer une extension de chaîne différente en utilisant UILabel
Le UILabel obtient une largeur fixe et le .numberOfLines est mis à 0. En ajoutant le texte et en appelant .sizeToFit (), il s'ajuste automatiquement à la hauteur correcte.
Le code est écrit en Swift 3 🔶🐦
la source
sizeToFit
Voici une solution simple qui fonctionne pour moi ... similaire à certaines des autres publiées, mais elle n'inclut pas la nécessité d'appeler
sizeToFit
Notez que ceci est écrit dans Swift 5
Cela gère l'enroulement de ligne et autres. Ce n'est pas le code le plus élégant, mais il fait le travail.
la source
la source
C'est ma réponse dans Swift 4.1 et Xcode 9.4.1
Maintenant, vous appelez cette fonction
la source
J'ai trouvé que la réponse acceptée fonctionnait pour une largeur fixe, mais pas pour une hauteur fixe. Pour une hauteur fixe, cela augmenterait simplement la largeur pour tout ranger sur une seule ligne, sauf s'il y avait un saut de ligne dans le texte.
La fonction width appelle la fonction height plusieurs fois, mais c'est un calcul rapide et je n'ai pas remarqué de problèmes de performances en utilisant la fonction dans les lignes d'un UITable.
la source
minimumTextWrapWidth:CGFloat
?Vérifiez la hauteur du texte de l'étiquette et il y travaille
la source
Cette solution aidera à calculer la hauteur et la largeur lors de l'exécution.
Ici, vous pouvez calculer la hauteur estimée que prendrait votre chaîne et la transmettre au cadre UILabel.
la source
Swift 5:
Si vous avez UILabel et que le boundingRect ne fonctionne pas pour vous (j'ai rencontré ce problème. Il a toujours renvoyé 1 hauteur de ligne.) Il y a une extension pour calculer facilement la taille de l'étiquette.
Vous pouvez l'utiliser comme ceci:
Travaille pour moi
la source
la source