2012-05-21 13 views
5

Próbuję zamiast tego przekonwertować code found here na algorytm binarny, ponieważ metoda liniowa jest strasznie powolna. Mam działającą implementację, ale wydaje się, że jest coś, czego mi brakuje, ponieważ uzyskiwane wyniki nie są dokładne (to znaczy, jeśli dodaję lub odejmuję 20 lub więcej pikseli od szerokości, otrzymuję taki sam obcięty string.it powinien być trochę bardziej dokładny i mieć bliższe cięcie):Skróć NSString do szerokości

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

Czy ktoś może spoglądać z nietoperza, co może być z tym nie tak? (Jest to metoda kategoria, więc self jest NSString

+0

Dlaczego trzeba to obliczać samodzielnie? Co robisz ze struną? Jeśli wyświetlasz go tylko wewnątrz etykiety, możesz skonfigurować etykietę, aby ją obciąć. Możesz nawet pozwolić, aby etykieta nieco zmniejszyła rozmiar czcionki, aby dopasować tekst, aby zapobiec obcięciu. –

+0

Rysuję i potrzebuję dodać elipsy na końcu. Chcę również zawijać cytaty wokół niego, więc drawInRect zLineBreakMode nie jest tutaj opcją, ponieważ odciąłby końcowy cytat .. – Snowman

+0

Thx koleś dla twojego linku powyżej .. Szukałem mojego rozwiązania problemu jak szalonego ale w końcu znalazłem to w twoim poście .. – Rendy

Odpowiedz

2

Jestem całkiem pewien, że ta linia jest źle.

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

Oznacza to, że każde podanie, jesteś badając tylko wielkość napisu od min do mid - to nie jest łańcuch znaków, który zostanie wyświetlony, ale ponieważ min maszeruje w górę ciągu podczas wyszukiwania. Powinieneś zawsze testować zaczynając od początku ciągu znaków:

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

, którą właśnie powrócisz po zakończeniu wyszukiwania.

+0

Ach tak, to był problem! Dzięki! – Snowman

+3

Zauważ, że '[string substringToIndex: mid]' pozwoli ci zaoszczędzić kroku tworzenia NSRange. – benzado