2010-11-04 20 views
12

C'è un modo per ottenere la parte visibile del testo nella parola avvolta UILabel? Intendo esattamente l'ultimo personaggio visibile?UILabel parte visibile del testo

Mi piacerebbe fare due etichette per arrotondare l'immagine e vorrei continuare il testo che era fuori dal rect per la prima etichetta sul secondo.

Conosco [NSString sizeWithFont...] ma c'è qualcosa che si inverte come [NSString stringVisibleInRect: withFont:...]? :-)

Grazie in anticipo.

risposta

7

si potrebbe usare una categoria per estendere NSString e creare il metodo si parla

@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

Ciao! Grazie uomo. Ma mi sembra che questo metodo con loop sia troppo pesante. Mi piacerebbe trovare qualcosa di nativo. – Evgeny

+0

Non sono a conoscenza di un modo per farlo in modo nativo. A meno che non chiami questo codice una quantità enorme, non immagino che avrebbe alcun impatto negativo sulla tua app. Potresti considerare alloc e rilasciare tutte le istanze di stringa se sei veramente preoccupato dell'uso della memoria. – Vertism

+1

Non mi preoccupo della memoria ma solo del carico del processore. Sembra che sizeWithFont dovrebbe essere davvero pesante e mi chiedevo se ci fosse un modo per ottenere, ad esempio, un evento UILabel quando ritagliava del testo ... La mia domanda riguardava :-) Ma a me sembra che lì non è una soluzione. L'unico modo è tuo. – Evgeny

0

Ecco un O (log n) il metodo con iOS 7 API. Solo superficialmente testato, si prega di commentare se trovate qualche bug.

- (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

Penso di averti battuto con O (1) per quanto riguarda l'accesso a CoreText: http://stackoverflow.com/a/25899300/860000 –