2010-11-04 2 views
12

Gibt es eine Möglichkeit, den sichtbaren Teil des Textes in ein Wort zu verpacken UILabel? Ich meine genau das letzte sichtbare Zeichen?UILabel sichtbarer Teil des Textes

Ich möchte zwei Etiketten runden, die das Bild runden und möchte den Text fortsetzen, der für das erste Etikett auf dem zweiten unrichtig war.

Ich weiß, [NSString sizeWithFont...] aber gibt es etwas wie [NSString stringVisibleInRect: withFont:...] Umkehrung? :-)

Vielen Dank im Voraus.

Antwort

7

Sie eine Kategorie verwenden könnte NSString zu erweitern und die Methode erstellen Sie

erwähnen
@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

Hallo! Danke, Mann. Aber mir scheint, dass diese Methode mit Schleife zu schwer ist. Ich möchte etwas Eigenes finden. – Evgeny

+0

Mir ist keine Möglichkeit bekannt, dies nativ zu tun. Wenn Sie diesen Code nicht als riesigen Betrag bezeichnen, würde ich mir nicht vorstellen, dass sich dies negativ auf Ihre App auswirken würde. Sie könnten alloin und alle String-Instanzen freigeben, wenn Sie sich wirklich Gedanken über die Speicherauslastung machen. – Vertism

+1

Ich mache mir keine Gedanken über Speicher, sondern nur Prozessorlast. Es scheint, dass sizeWithFont wirklich schwer sein sollte und ich frage mich, ob es irgendeinen Weg gibt, zum Beispiel UILabel-Event zu bekommen, wenn es Text wegschneidet ... Das ist meine Frage :-) Aber es scheint mir, dass es da ist ist keine Lösung. Der einzige Weg ist dein. – Evgeny

0

Hier ist ein O (log n) Methode mit iOS 7 APIs. Nur oberflächlich getestet, bitte Kommentar, wenn Sie irgendwelche Fehler finden.

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

Ich denke, ich habe dich mit O (1) in Bezug auf CoreText geschlagen: http://Stackoverflow.com/a/25899300/860000 –