2012-05-21 5 views
5

Ich versuche, die code found here in einen binären Algorithmus stattdessen zu konvertieren, da die lineare Methode schrecklich langsam ist. Ich habe eine funktionierende Implementierung, aber Theres scheint etwas zu sein, das ich vermisse, da die Ergebnisse, die ich bekomme, nicht genau sind (das heißt, wenn ich 20 oder so Pixel von der Breite addiere oder subtrahiere, bekomme ich dasselbe gekürzt string..it sollte ein wenig genauer und haben einen genaueren Schnitt) sein:Trunkieren Sie einen NSString zu Breite

-(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)]; 
} 

Kann jemand den Schläger sehen vor, was daran falsch sein könnte? (Dies ist eine Kategorie-Methode, so self ist ein NSString

+0

Warum müssen Sie das selbst berechnen? Was machst du mit der Schnur? Wenn Sie es nur innerhalb eines Labels anzeigen, können Sie das Label so konfigurieren, dass es für Sie abgeschnitten wird. Sie können sogar zulassen, dass das Label die Schriftgröße ein wenig verkleinert, damit der Text angepasst werden kann, um ein Abschneiden zu verhindern. –

+0

Ich zeichne es und muss am Ende eine Ellipse hinzufügen. Ich möchte auch Zitate um ihn herum, so dass die DrawInRect withLineBreakMode ist keine Option hier, da es würde die Ende Zitat abgeschnitten .. – Snowman

+0

Thx Kumpel für Ihren Link oben .. Ich suchte nach meinem Problem Lösung wie verrückt, aber endlich gefunden in deinem Beitrag .. – Rendy

Antwort

2

Ich bin ziemlich sicher, diese Linie nicht stimmt.

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

Das bedeutet, dass jeder Pass, sind Sie nur die Größe des Strings untersuchen min-mid - das ist nicht die Zeichenfolge, die Sie am Ende der Anzeige gehen, obwohl, weil min die Zeichenfolge Aufmarsch als Sie suchen sollen Sie immer vom Anfang des Strings werden testen Start:

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

was Sie zurückgeben werden, wenn Ihre Suche abgeschlossen ist.

+0

Ah ja das war das Problem! Vielen Dank! – Snowman

+3

Beachten Sie, dass '[string substringToIndex: mid]' den Schritt der Erstellung eines NSRange speichert. – benzado