2010-02-15 13 views
6

En UILabel hay una funcionalidad para truncar etiquetas usando diferentes técnicas de truncamiento (UILineBreakMode). En NSString UIKit Additions hay una funcionalidad similar para dibujar cadenas.Cómo truncar un NSString basado en el ancho gráfico?

Sin embargo, no encontré ninguna manera de acceder a la cadena truncada real. ¿Hay alguna otra forma de obtener una cadena truncada basada en el ancho (gráfico) para una fuente determinada?

Me gustaría tener una categoría en NSString con este método:

-(NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode 

Respuesta

6

Una de las opciones está tratando diferentes tamaños haciendo un bucle hasta que llegue el ancho correcto. Es decir. comience con la cadena completa, si es más ancha de lo que necesita, reemplace los dos últimos caracteres con un carácter de puntos suspensivos. Bucle hasta que sea lo suficientemente estrecha.

Si crees que estarás trabajando con cadenas largas, puedes realizar búsquedas binarias hacia el punto de truncamiento para hacerlo un poco más rápido.

+0

Gracias Uli, buena idea. Funciona de maravilla. Ver el código en el otro comentario. –

17
- (NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode { 
    NSMutableString *resultString = [[self mutableCopy] autorelease]; 
    NSRange range = {resultString.length-1, 1}; 

    while ([resultString boundingRectWithSize:CGSizeMake(FLT_MAX, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size.width > width) { 
     // delete the last character 
     [resultString deleteCharactersInRange:range]; 
     range.location--; 
     // replace the last but one character with an ellipsis 
     [resultString replaceCharactersInRange:range withString:truncateReplacementString]; 
    } 
    return resultString; 
} 

Tenga en cuenta que desde iOS 6 este método ya no es seguro para ejecutar en hilos de fondo.

+0

Probablemente, se debe actualizar con el método iOS - boundingRectWithSize: options: attributes: context :, debido a la desaprobación. – skyylex

+0

@skyylex de hecho. Hecho. –

Cuestiones relacionadas