UIButton Titre de l'Étiquette de retour avec Troncature Queue
J'ai besoin d'activer le mot d'habillage et de la queue de troncature, en même temps, sur un UIButton
's titleLabel
. Réglage numberOfLines à quelque chose de plus que 0 ne fonctionne pas, le texte reste sur une seule ligne.
J'ai déjà cherché et n'ai pas trouvé de solution. Une idée?
- stackoverflow.com/questions/6598831/...
- comment résoudre mon problème?
UILineBreakModeTailTruncation
? Tronquer le texte (si nécessaire) à partir de la fin de la ligne. Pour plusieurs lignes de texte, seul le texte sur la dernière ligne est tronquée.- Ouais, mais plusieurs lignes ne fonctionnent que si j'ai ajouter des caractères de saut de ligne manuellement, à droite? Fondamentalement, j'ai une longue chaîne et le besoin de l'afficher sur plusieurs lignes (word-wrap) et de le tronquer si il est plus long que l'étiquette (troncature queue).
- Non, vous n'avez pas besoin d'ajouter des caractères de saut de ligne manuellement. Le texte dans la
UILabel
sera automatiquement renvoyé à la ligne sur de nouvelles lignes.
Vous devez vous connecter pour publier un commentaire.
C'est pas correct:
NSLineBreakMode est défini dans NSParagraphStyle.h comme:
Noter que c'est un NS_ENUM, pas un NS_OPTION, de sorte qu'il n'est pas destiné à être utilisé comme un masque. Pour plus d'informations, voir cette.
Dans la réalité à l'aide de la | opérateur sur ces constantes conduit à un masque correspondant NSLineBreakByTruncatingTail:
Autant que je sache, la troncation de la dernière ligne de Base du Texte et aussi faire des retour à la ligne ne peut pas être fait avec la simple CTFramesetterCreateWithAttributedstring & CTFrameDraw Api, mais peut être fait avec la ligne par ligne de mise en page, qui UILabel doit être en train de faire.
iOS 6 simplifie ce en exposant les nouvelles Api de dessin dans NSStringDrawing.h:
Donc, si vous utilisez UILabel, vous voulez que votre NSAttributedString de NSParagraphStyle ou la lineBreakMode sur l'étiquette elle-même à définir :
Et la numberOfLines de propriété sur l'étiquette doit être mis à 0.
De la UILabel les en-têtes sur numberOfLines:
De la UILabel documentation:
Le seul problème qui se pose à présent un peu obscure fonction de UILabel, c'est que vous ne pouvez pas obtenir la taille avant le dessin (qui est une nécessité pour certains UITableView + UITableViewCell des mises en pages dynamiques) sans avoir recours à la modification de la NSAttributedString de NSParagraphStyle à la volée.
Comme de l'iOS 6.1.4, appel boundingRectWithSize:options:contexte, avec une NSAttributedString qui a un NSLineBreakByTruncatingTail saut de ligne mode (pour UILabel), renvoie une mauvaise seule hauteur de la ligne même si les options suivantes sont transmises:
(Veuillez noter que NSStringDrawingUsesLineFragmentOrigin est une nécessité pour le multi en ligne de chaînes de caractères.)
Ce qui est pire, c'est que UILabel de lineBreakMode ne pas remplacer la NSAttributedStrings style de paragraphe, de sorte que vous devez modifier votre attribué la chaîne de style de paragraphe pour votre dimensionnement calcul, et plus tard pour passer à l'UILabel de sorte qu'il peut le dessiner.
Qui est, NSLineBreakByWordWrapping pour -boundingRectWithSize:options:contexte et NSLineBreakByTruncatingTail pour la UILabel (de sorte qu'il peut, utiliser NSStringDrawingTruncatesLastVisibleline à l'interne, ou de tout ce qu'il fait pour le clip de la dernière ligne)
La seule alternative si vous ne voulez pas muter votre chaîne de style de paragraphe plus d'une fois beaucoup serait de faire un simple sous-classe UIView qui l'emporte sur -drawRect: (avec la bonne contentMode ensemble de redessiner ainsi), et utilise iOS 6, la nouvelle API de dessin:
Souvenant d'utiliser NSLineBreakByWordWrapping et en passant (NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleline) que les options.
Enfin, avant d'iOS 6, si vous vouliez faire mot d'habillage + troncature queue pour un attribuées chaîne que vous avez à faire ligne par ligne de mise en page vous-même à Base de Texte.
Je l'ai résolu le jour même où j'ai posté cette question en mettant un
UIButton
sur le haut d'uneUILabel
avecnumberOfLines
fixé à 3. J'avais laissé ce refusés pour voir si quelqu'un a une meilleure idée, mais apparemment il n'y a pas d'autre solution.NSLineBreakMode
et vous allez voir pourquoi. (Ou la réponse ci-dessus)Assurez-vous que vous définissez
Alignment
premièreps: cela ne fonctionne que lorsque la version du système est plus grande que la 5.0
Essayer de régler le numberOfLines plus de 2, et de définir la hauteur aussi en conséquence.
Vous pouvez spécifier plus d'un lineBreakMode sur une étiquette en utilisant l'opérateur or.
Par exemple, le code suivant devrait envelopper le texte de l'étiquette, et permettrait d'ajouter les points de suspension à la fin de la queue du texte lors de l'expansion au-delà de la taille de l'étiquette de la hauteur du cadre.
Mise à JOUR: ce n'est pas correct. Il semble fonctionner car
UILineBreakModeWordWrap
est 0 dans l'enum. Voir les commentaires ci-dessous.UILineBreakModeWordWrap
est0
donc ce que vous êtes en train de faire est la même quelblTemp.lineBreakMode = UILineBreakModeTailTruncation
. C'est en fait valable (par le commentaire dans l'en-tête) pour multiligne étiquettes.Toutes les propriétés de l'INTERFACE utilisateur sont déconseillés dans iOS Utilisation NS abréviations au lieu de l'INTERFACE utilisateur. Comme le montre l'exemple ici -
NSLineBreakByTruncatingMiddle