2012-01-24 3 views
5

Im travaillant sur une application ios en utilisant l'objectif c et j'ai un problème avec uilabel que je pourrais utiliser une aide avec. Fondamentalement j'ai une étiquette qui peut changer la taille pour adapter le texte qu'il montrera mais il a une taille maximum qu'il peut être possible. l'étiquette elle-même a une largeur fixe à tout moment. J'ai activé UILineBreakModeWordWrap et UILineBreakModeTailTruncation pour que le texte s'ajuste et soit tronqué, mais le texte est tronqué trop tôt lorsqu'il n'a plus qu'un mot à placer. plutôt que de le déplacer sur la ligne suivante quand il y a encore de la place, il le tronque juste.uilabel queue troncature

self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0); 
self.lineBreakMode = UILineBreakModeWordWrap | UILineBreakModeTailTruncation; 
self.numberOfLines = 0; 
[self sizeToFit]; 

est là de toute façon de trouver quand le UILabel tronque effectivement le texte afin que je puisse ensuite vérifier la hauteur de l'étiquette et y ajouter s'il y a encore de la place? J'ai essayé d'ajouter toujours une ligne supplémentaire à la hauteur quand il y a de la place et cela évite la troncature précoce, mais je suis parti avec un dimensionnement incohérent de l'ensemble de l'étiquette. des idées sur ce serait un grand merci

Répondre

10

lineBreakMode est un commutateur. Il peut être soit (pour iOS6 +) NSLineBreakByWordWrapping ou NSLineBreakByTruncatingTail mais pas les deux. Mais, pour répondre à votre question, vous pouvez trouver la taille d'un texte en utilisant les extensions de classe au NSString+UIKit. Ayant trouvé la taille que vous pourriez mettre à jour le cadre de la UILabel de manière appropriée.

+0

finit par obtenir la taille qu'il serait du lien que vous avez fourni (sizeWithFont :), puis définissez le linebreakmode à wordwrap ou queue trunc selon si elle était à max ou pas, puis utilisé sizetofit et a travaillé très bien – glogic

+0

sur cette catégorie. Je ne savais pas qu'il existait avant. – chakrit

0

En utilisant cette méthode:

How to find UILabel's number of Lines

Vous pouvez définir l'étiquette à la hauteur maximum, savoir de quelle taille le texte est dans cette étiquette et rétrécissent comme nécessaire .

1

J'ai écrit une catégorie pour travailler avec la troncature de UILabel. Fonctionne sur iOS 7 et versions ultérieures. J'espère que cela aide !

@implementation UILabel (Truncation) 

- (NSRange)truncatedRange 
{ 
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]]; 

    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
    [textStorage addLayoutManager:layoutManager]; 

    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size]; 
    textContainer.lineFragmentPadding = 0; 
    [layoutManager addTextContainer:textContainer]; 

    NSRange truncatedrange = [layoutManager truncatedGlyphRangeInLineFragmentForGlyphAtIndex:0]; 
    return truncatedrange; 
} 

- (BOOL)isTruncated 
{ 
    return [self truncatedRange].location != NSNotFound; 
} 

- (NSString *)truncatedText 
{ 
    NSRange truncatedrange = [self truncatedRange]; 
    if (truncatedrange.location != NSNotFound) 
    { 
     return [self.text substringWithRange:truncatedrange]; 
    } 

    return nil; 
} 

@end 
+1

cela ne fonctionne pas pour plusieurs lignes –

0

Je suis venu à un problème similaire, et a résolu le problème avec une solution très simple (testé sur ios 8.4, Xcode 7).

Dans IB (j'utilise autolayout avec quelques contraintes):

set UIlabel numberOfLine = 1; 
LineBrakeMode = TruncateTail 

Dans le code:

label.numberOfLines = 2; // I can only display 2 row. 
// I supposed you should know how many rows you can displayed. 

label.preferredMaxLayoutWidth = label.frame.size.width; 
[label sizeToFit]; 

Tadaa. C'est tout. Notez que cela ne fonctionne qu'avec UILabel. Avec UIButton, cela peut ne pas fonctionner (N'a pas testé).

+0

+1 pour dévoiler l'attribut "preferredMaxLayoutWidth". J'ai un autre cas de topicstarter, mais cet attribut a résolu mon problème. –