2012-01-24 11 views
5

Estoy trabajando en una aplicación ios usando el objetivo cy tengo un problema con uilabel con el que podría necesitar ayuda. Básicamente, tengo una etiqueta que puede cambiar el tamaño para que se ajuste al texto que se mostrará, pero tiene una altura máxima que puede ser. la etiqueta en sí tiene un ancho fijo en todo momento. He activado UILineBreakModeWordWrap y UILineBreakModeTailTruncation para hacer que el texto se ajuste y se trunque, pero esto hace que el texto trunque la cola demasiado pronto cuando solo le queda 1 palabra para colocar. en lugar de moverlo a la siguiente línea cuando aún hay espacio, simplemente lo trunca.truncamiento de cola uilabel

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

¿Hay alguna forma de encontrar cuando el UILabel es en realidad truncar el texto, así que entonces puedo comprobar la altura de la etiqueta y añadir a ella si todavía hay espacio? Intenté siempre agregar una línea adicional a la altura cuando hay espacio y esto evita el truncamiento temprano, pero luego me quedo con un tamaño incoherente de la etiqueta general. alguna idea sobre esto sería grande gracias

Respuesta

10

lineBreakMode es un interruptor. Puede ser (para iOS6 +) NSLineBreakByWordWrapping o NSLineBreakByTruncatingTail pero no ambos.

Pero, para responder a su pregunta, puede encontrar el tamaño de algunos textos utilizando las extensiones de clase en NSString+UIKit. Una vez encontrado el tamaño, puede actualizar el marco del UILabel de forma adecuada.

+0

terminó obteniendo el tamaño que sería del enlace que proporcionó (sizeWithFont :) y luego configuró el modo linebreak a wordwrap o tail trunc dependiendo de si estaba en max o no y luego usó sizetofit y funcionó de maravilla – glogic

+0

Nice tip en esa categoría. No sabía que existía antes. – chakrit

1

He escrito una categoría para trabajar con el truncamiento de UILabel. Funciona en iOS 7 y versiones posteriores. Espero eso ayude !

@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

no funciona para líneas múltiples –

0

Sólo vine a un problema similar, y lo resolvió con una solución muy simple (probado en ios 8.4, Xcode 7).

En IB (yo uso el diseño automático con algunas restricciones):

set UIlabel numberOfLine = 1; 
LineBrakeMode = TruncateTail 

En Código:

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. Eso es. Tenga en cuenta que esto solo funciona con UILabel. Con UIButton, es posible que no funcione (No se ha probado).

+0

+1 para develar el atributo "preferredMaxLayoutWidth". Tengo otro caso de topicstarter, pero este atributo resolvió mi problema. –