J'en ai une UILabel
qui peut avoir des longueurs variables selon que mon application fonctionne ou non en mode portrait ou paysage sur un iPhone ou un iPad. Lorsque le texte est trop long pour s'afficher sur une ligne et qu'il tronque, je veux que l'utilisateur puisse appuyer dessus et obtenir une fenêtre contextuelle du texte intégral.
Comment puis-je vérifier si le UILabel
tronque le texte? Est-ce même possible? Pour le moment, je vérifie simplement les différentes longueurs en fonction du mode dans lequel je suis, mais cela ne fonctionne pas très bien.
UILabel
API.Réponses:
Vous pouvez calculer la largeur de la chaîne et voir si la largeur est supérieure à
label.bounds.size.width
NSString UIKit Additions dispose de plusieurs méthodes pour calculer la taille de la chaîne avec une police spécifique. Cependant, si vous avez un minimumFontSize pour votre étiquette, cela permet au système de réduire le texte à cette taille. Vous pouvez utiliser sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode: dans ce cas.
la source
numberOfLines
renvoie le nombre maximum de lignes utilisées pour afficher le texte comme indiqué dans laUILabel
référence de classe: developer.apple.com/library/ios/documentation/UIKit/Reference/…Swift (comme extension) - fonctionne pour uilabel multi-lignes:
swift4: (paramètre
attributes
deboundingRect
légèrement modifié)swift3:
swift2:
la source
EDIT: Je viens de voir que ma réponse a été votée pour, mais l'extrait de code que j'ai donné est obsolète.
Maintenant, la meilleure façon de faire est (ARC):
Notez que la taille calculée n'est pas une valeur entière. Donc, si vous faites des choses comme
int height = rect.size.height
, vous perdrez une certaine précision en virgule flottante et pourriez avoir des résultats erronés.Ancienne réponse (obsolète):
Si votre étiquette est multiligne, vous pouvez utiliser ce code:
la source
vous pouvez créer une catégorie avec UILabel
la source
textRectForBounds:limitedToNumberOfLines:
"Vous ne devriez pas appeler cette méthode directement" ...setNeedsLayout()
layoutIfNeeded()
au début de la méthode.Utilisez cette catégorie pour savoir si une étiquette est tronquée sur iOS 7 et supérieur.
la source
Swift 3
Vous pouvez compter le nombre de lignes après avoir attribué la chaîne et comparer au nombre maximum de lignes de l'étiquette.
la source
Pour ajouter à la réponse d' iDev , vous devez utiliser à la
intrinsicContentSize
place deframe
, pour que cela fonctionne pour la mise en page automatiquela source
Ça y est. Cela fonctionne avec
attributedText
, avant de retomber dans la plainetext
, ce qui a beaucoup de sens pour nous, gens qui traitons plusieurs familles de polices, tailles et même NSTextAttachments!Fonctionne bien avec la mise en page automatique, mais de toute évidence, les contraintes doivent être définies et définies avant de vérifier
isTruncated
, sinon l'étiquette elle-même ne saura même pas comment se présenter, donc il ne saurait même pas si elle est tronquée.Il ne fonctionne pas d'aborder ce problème avec juste un simple
NSString
etsizeThatFits
. Je ne sais pas comment les gens obtenaient des résultats positifs comme ça. BTW, comme mentionné à de nombreuses reprises, l'utilisationsizeThatFits
n'est pas du tout idéale car elle prend en comptenumberOfLines
la taille résultante, ce qui va à l'encontre de l'objectif de ce que nous essayons de faire, car elleisTruncated
reviendrait toujours, qu'ellefalse
soit tronquée ou non.la source
Voici la réponse sélectionnée dans Swift 3 (en tant qu'extension). L'OP demandait environ 1 ligne d'étiquettes. La plupart des réponses rapides que j'ai essayées ici sont spécifiques aux étiquettes multilignes et ne signalent pas correctement les étiquettes à une seule ligne.
la source
Cela fonctionne pour iOS 8:
la source
J'ai écrit une catégorie pour travailler avec la troncature d'UILabel. Fonctionne sur iOS 7 et versions ultérieures. J'espère que ça aide ! troncature de queue uilabel
la source
Vous pouvez calculer la largeur de la chaîne et voir si la largeur est supérieure à la largeur de l'étiquette.
la source
Pour ajouter à ce que @iDev a fait, j'ai modifié le
self.frame.size.height
pour utiliserlabel.frame.size.height
et je ne l'ai pas non plus utiliséNSStringDrawingUsesLineFontLeading
. Après ces modifications, j'ai réalisé un calcul parfait du moment où la troncature se produirait (du moins pour mon cas).la source
J'ai eu des problèmes
boundingRect(with:options:attributes:context:)
lors de l'utilisation de la mise en page automatique (pour définir une hauteur maximale) et d'un texte attribué avecNSParagraph.lineSpacing
L'espacement entre les lignes était ignoré (même lorsqu'il était transmis
attributes
à laboundingRect
méthode), de sorte que l'étiquette pouvait être considérée comme non tronquée lorsqu'elle l'était.La solution que j'ai trouvée est d'utiliser
UIView.sizeThatFits
:la source
Parce que toutes les réponses ci-dessus utilisent des méthodes dépréciées, j'ai pensé que cela pourrait être utile:
la source
Pour gérer iOS 6 (oui, certains d'entre nous doivent encore le faire), voici une autre extension de la réponse de @ iDev. La clé à retenir est que, pour iOS 6, assurez-vous que numberOfLines de votre UILabel est défini sur 0 avant d'appeler sizeThatFits; sinon, cela vous donnera un résultat qui dit que "les points pour dessiner numberOfLines d'une valeur de hauteur" sont nécessaires pour dessiner le texte de l'étiquette.
la source
Assurez-vous d'appeler l'un de ces éléments dans viewDidLayoutSubviews.
la source
SWIFT 5
Exemple pour un UILabel à lignes multiples configuré pour n'afficher que 3 lignes.
Bien que l'utilisateur puisse sélectionner la touche de retour en ajoutant une ligne supplémentaire sans ajouter à la "largeur du texte", dans ce cas, quelque chose comme cela peut également être utile.
la source
Solution Swift 3
Je pense que la meilleure solution est de (1) créer un
UILabel
avec les mêmes propriétés que l'étiquette que vous vérifiez pour la troncature, (2) appeler.sizeToFit()
, (3) comparer les attributs de l'étiquette factice avec votre étiquette réelle.Par exemple, si vous souhaitez vérifier si une étiquette à une ligne qui a une largeur variable tronque ou non, vous pouvez utiliser cette extension:
... mais encore une fois, vous pouvez facilement modifier le code ci-dessus en fonction de vos besoins. Disons que votre étiquette est multiligne et a une hauteur variable. Ensuite, l'extension ressemblerait à ceci:
la source
Ne serait-il pas facile de définir l'attribut title pour le libellé, le paramétrer affichera le libellé complet lors du survol.
vous pouvez calculer la longueur de l'étiquette et la largeur div (convertir en longueur - jQuery / Javascript - Comment puis-je convertir une valeur de pixel (20px) en une valeur numérique (20) ).
set jquery pour définir le titre si la longueur est supérieure à la largeur div.
la source