2012-05-21 10 views
5

Estoy tratando de convertir el code found here en un algoritmo binario, ya que el método lineal es terriblemente lento. Tengo una implementación en funcionamiento, pero parece que me falta algo, ya que los resultados que obtengo no son precisos (es decir, si agrego o resta 20 píxeles del ancho, obtengo el mismo truco string..it debería ser un poco más precisos y tienen un corte más cerca):Truncar un NSString al ancho

-(NSString*)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont*)font addQuotes:(BOOL)addQuotes 
{ 
    int min = 0, max = self.length, mid; 
    while (min < max) { 
     mid = (min+max)/2; 

     NSString *currentString = [self substringWithRange:NSMakeRange(min, mid - min)]; 
     CGSize currentSize = [currentString sizeWithFont:font]; 

     if (currentSize.width < width){ 
      min = mid + 1; 
     } else if (currentSize.width > width) { 
      max = mid - 1; 
     } else { 
      min = mid; 
      break; 
     } 
    } 
    return [self substringWithRange:NSMakeRange(0, min)]; 
} 

Puede alguien ver de buenas a lo que podría ser malo en eso? (Este es un método categoría, por lo que es un self NSString

+0

¿Por qué necesita calcular esto usted mismo? ¿Qué estás haciendo con la cuerda? Si solo lo muestra dentro de una etiqueta, puede configurar la etiqueta para truncarlo por usted. Incluso puede permitir que la etiqueta reduzca un poco el tamaño de la fuente para poder ajustar el texto y evitar el truncamiento. –

+0

Lo estoy dibujando y necesito agregar una elipsis al final. También quiero envolver las comillas, así que drawInRect withLineBreakMode no es una opción aquí, ya que cortaría la cotización final. – Snowman

+0

Thx amigo para su enlace de arriba .. Busqué mi solución de problema como loca pero finalmente la encontré en tu publicación ... – Rendy

Respuesta

2

Estoy bastante seguro de esta línea es incorrecto:.

[self substringWithRange:NSMakeRange(min, mid - min)]; 

Esto significa que cada pase, que está a sólo examinar el tamaño de la cadena de min a mid - que no es la cadena que se va a terminar mostrando, sin embargo, porque min está marchando la cadena como se busca siempre debe ser estar probando a partir del principio de la cadena:

.
[self substringWithRange:NSMakeRange(0, mid)]; 

que es lo que vas a devolver cuando finalices tu búsqueda.

+0

¡Ah, sí, este es el problema! ¡Gracias! – Snowman

+3

Tenga en cuenta que '[string substringToIndex: mid]' le ahorrará el paso de crear un NSRange. – benzado

Cuestiones relacionadas