truncamiento de la cola de uilabel

Estoy trabajando en una aplicación iOS con el objective c y 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.

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 realmente está truncando el texto para poder verificar la altura de la etiqueta y agregarle 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. cualquier idea sobre esto sería genial gracias

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 usando las extensiones de clase en NSString+UIKit . Una vez encontrado el tamaño, puede actualizar el marco de UILabel adecuada.

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 

Usando este método:

Cómo encontrar el número de líneas de UILabel

Puede establecer la etiqueta a la altura máxima, averiguar qué tan alto es el texto en esa etiqueta y reducirla según sea necesario.

Acabo de llegar a un problema similar y lo resolví con una solución muy simple (probada en ios 8.4, xcode 7).

En IB (utilizo el autolayout con algunas restricciones):

 set UIlabel numberOfLine = 1; LineBrakeMode = TruncateTail 

En codigo:

 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).