2010-11-04 13 views
12

Czy istnieje sposób na uzyskanie widocznej części tekstu w owiniętym słowie UILabel? Mam na myśli właśnie ostatnią widoczną postać?UILabel widoczna część tekstu

Chciałbym zrobić dwie etykiety zaokrąglające obrazek i chciałbym kontynuować tekst, który nie był poprawny dla pierwszej etykiety na drugiej.

Wiem, że [NSString sizeWithFont...], ale czy jest coś odwrotnego, jak [NSString stringVisibleInRect: withFont:...]? :-)

Z góry dziękuję.

Odpowiedz

7

Można użyć kategorię przedłużyć NSString i stworzyć metodę można wymienić

@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

Witam! Dzięki. Ale wydaje mi się, że ta metoda z pętlą jest zbyt ciężka. Chciałbym znaleźć coś rodzimego. – Evgeny

+0

Nie jestem świadomy sposób to zrobić natywnie. Jeśli nie wywołasz tego kodu w ogromnej ilości, nie wyobrażam sobie, że miałoby to negatywny wpływ na twoją aplikację. Możesz spojrzeć na alokowanie i zwalnianie wszystkich instancji napisów, jeśli naprawdę martwisz się o użycie pamięci. – Vertism

+1

Nie martwię się pamięcią, tylko obciążeniem procesora. Wygląda na to, że sizeWithFont powinien być naprawdę ciężki i zastanawiałem się, czy jest jakikolwiek sposób, aby uzyskać np. Wydarzenie UILabel, gdy wyrzuci jakiś tekst ... To jest moje pytanie :-) Ale wydaje mi się, że nie jest rozwiązaniem. Jedyny sposób jest twój. – Evgeny

0

Oto O metodę z iOS 7 API (n log). Tylko powierzchownie przetestowany, proszę komentarz, jeśli znajdziesz jakieś błędy.

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

Wydaje mi się, że pokonałem Corena z tekstem O (1): http://stackoverflow.com/a/25899300/860000 –

Powiązane problemy