2010-11-04 24 views
12

¿Hay alguna manera de obtener la parte visible del texto en la palabra envuelta UILabel? Me refiero exactamente al último personaje visible?UILabel parte visible del texto

Me gustaría hacer dos etiquetas para redondear la imagen y me gustaría continuar el texto que estaba fuera de rect para la primera etiqueta en la segunda.

[NSString sizeWithFont...] pero hay algo revertir como [NSString stringVisibleInRect: withFont:...]? :-)

Gracias de antemano.

Respuesta

7

se puede utilizar una categoría para extender NSString y crear el método que mencionas

@interface NSString (visibleText) 

- (NSString*)stringVisibleInRect:(CGRect)rect withFont:(UIFont*)font; 

@end 

@implementation NSString (visibleText) 

- (NSString*)stringVisibleInRect:(CGRect)rect withFont:(UIFont*)font 
{ 
    NSString *visibleString = @""; 
    for (int i = 1; i <= self.length; i++) 
    { 
     NSString *testString = [self substringToIndex:i]; 
     CGSize stringSize = [testString sizeWithFont:font]; 
     if (stringSize.height > rect.size.height || stringSize.width > rect.size.width) 
      break; 

     visibleString = testString; 
    } 
    return visibleString; 
} 

@end 
+1

Hi! Gracias hombre. Pero me parece que este método con bucle es demasiado pesado. Me gustaría encontrar algo nativo. – Evgeny

+0

No conozco una forma de hacerlo de forma nativa. A menos que llame a este código una gran cantidad, no me imagino que tendría un impacto negativo en su aplicación. Puede consultar alloc y liberar todas las instancias de cadena si realmente está preocupado por el uso de la memoria. – Vertism

+1

No me preocupo por la memoria, solo por la carga del procesador. Parece que sizeWithFont debería ser muy pesado y me pregunto si hay alguna manera de obtener, por ejemplo, el evento UILabel cuando recoja algo de texto de distancia ... Esa es mi pregunta era acerca de :-) Pero me parece que allí no hay solución El único camino es el tuyo. – Evgeny

0

Aquí está un método O con iOS 7 API (log n). Solo probado superficialmente, por favor coméntelo si encuentra algún error.

- (NSRange)hp_visibleRange 
{ 
    NSString *text = self.text; 
    NSRange visibleRange = NSMakeRange(NSNotFound, 0); 
    const NSInteger max = text.length - 1; 
    if (max >= 0) 
    { 
     NSInteger next = max; 
     const CGSize labelSize = self.bounds.size; 
     const CGSize maxSize = CGSizeMake(labelSize.width, CGFLOAT_MAX); 
     NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
     paragraphStyle.lineBreakMode = self.lineBreakMode; 
     NSDictionary * attributes = @{NSFontAttributeName:self.font, NSParagraphStyleAttributeName:paragraphStyle}; 
     NSInteger right; 
     NSInteger best = 0; 
     do 
     { 
      right = next; 
      NSRange range = NSMakeRange(0, right + 1); 
      NSString *substring = [text substringWithRange:range]; 
      CGSize textSize = [substring boundingRectWithSize:maxSize 
                 options:NSStringDrawingUsesLineFragmentOrigin 
                attributes:attributes 
                 context:nil].size; 
      if (textSize.width <= labelSize.width && textSize.height <= labelSize.height) 
      { 
       visibleRange = range; 
       best = right; 
       next = right + (max - right)/2; 
      } else if (right > 0) 
      { 
       next = right - (right - best)/2; 
      } 
     } while (next != right); 
    } 
    return visibleRange; 
} 
+0

Creo que te tengo vencido con O (1) con respecto a presionar CoreText: http://stackoverflow.com/a/25899300/860000 –