2012-05-01 9 views
5

Tengo un proyecto UILabel en mi iPhone que tiene un ancho y alto fijos, pero su contenido puede variar dependiendo de la el usuario está mirando. A veces, el texto es demasiado grande para UILabel y es cuando la cadena: '...' se agrega al final de la línea. Me pregunto si podría cambiar esta cadena por otra cosa, por ejemplo: '(más)'.Cambie el valor predeterminado '...' al final de un texto si el contenido de un UILabel no cabe

Gracias!

+0

¿Ha considerado establecer la propiedad de la etiqueta 'ajusteFontSizeToFitWidth' en YES para que la etiqueta ajuste el tamaño de fuente automáticamente? – kevboh

+0

Creo que @thematerik está hablando de comportamiento cuando alcanza el tamaño mínimo de letra y trunca el reemplazo con puntos suspensivos. Esta es una pregunta interesante. – danh

Respuesta

1

Desafortunadamente, parece que esta opción no está incluido en IOS, según esta pregunta similar: How to change truncate characters in UILabel?

Sin embargo, como las respuestas en el estado pregunta antes mencionada, esto se puede hacer fácilmente usted mismo. Todo lo que necesitas hacer es encontrar dónde se trunca la cadena y restar la cantidad necesaria para los caracteres finales elegidos. Luego coloque el resto en una cadena separada.

Para este método, esta respuesta también sería útil:

Como Javanator dicho que tendría que hacer su propia truncamiento. Debería utilizar el mensaje sizeWithFont: forWidth: lineBreakMode: en las adiciones de UIKit a la clase NSString para obtener el ancho de una cadena con una fuente determinada. Esto manejará todo tipo de fuentes.

1

pensé que esto era una pregunta interesante, por lo que apenas se construyó y probó esta ...

- (void)setText:(UILabel *)label withText:(NSString *)text andTruncationSuffix:(NSString *)truncationSuffix { 

    // just set the text if it fits using the minimum font 
    // 
    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:label.minimumFontSize]]; 
    if (size.width <= label.bounds.size.width) { 
     label.text = text; 
     return; 
    } 

    // build a truncated version of the text (using the custom truncation text) 
    // and shrink the truncated text until it fits 
    NSInteger lastIndex = text.length; 
    CGFloat width = MAXFLOAT; 

    NSString *subtext, *ellipticalText; 

    while (lastIndex > 0 && width > label.bounds.size.width) { 
     subtext = [text substringToIndex:lastIndex]; 
     ellipticalText = [subtext stringByAppendingString:truncationSuffix]; 
     width = [ellipticalText sizeWithFont:[UIFont systemFontOfSize:label.minimumFontSize]].width; 
     lastIndex--; 
    } 
    label.text = ellipticalText; 
} 

Llamada así:

[self setText:self.label withText:@"Now is the time for all good men to come to the aid of their country" andTruncationSuffix:@" more"]; 

Si esto funciona para usted, usted podría considere agregar una subclase de UILabel, usando esto para anular el método setText: y agregando una propiedad llamada truncatedSuffix.

+0

En el momento en que se estableció el texto, es posible que aún no se haya determinado el ancho de la etiqueta, especialmente si está utilizando el diseño automático. – ozgur

+0

@ozgur - sí, esta publicación está bastante desactualizada ahora, dado el diseño automático y todas las cosas nuevas de tipografía. incluso 'sizeWithFont' está en desuso ahora. tal vez lo vuelva a escribir en algún momento pronto. – danh

1

Si está utilizando iOS versión> 8.0, puede usar ResponsiveLabel. Aquí puede proporcionar token de truncamiento personalizado, así como definir acciones para que pueda tocarlo.

NSString *expansionToken = @"Read More ..."; 
NSString *str = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; 
NSMutableAttributedString *attribString = [[NSMutableAttributedString alloc]initWithString:kExpansionToken attributes:@{NSForegroundColorAttributeName:[UIColor blueColor],NSFontAttributeName:self.customLabel.font}]; 
[self.customLabel setAttributedTruncationToken:attribString withAction:^(NSString *tappedString) { 
NSLog(@"Tap on truncation text"); 
}]; 
[self.customLabel setText:str withTruncation:YES]; 
Cuestiones relacionadas