2012-05-21 83 views
5

我試圖將code found here轉換爲二進制算法,因爲線性方法非常慢。我有一個工作實現,但這似乎是我失蹤的一些東西,因爲我得到的結果並不精確(也就是說,如果我從寬度加上或減去20個像素,我會得到相同的截斷string..it應該有點更準確,並有接近切):將NSString截斷爲寬度

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

任何人都可以看到蝙蝠可能是什麼錯呢? (這是一個類的方法,因此self是一個NSString

+0

你爲什麼需要自己計算一下?你在做什麼?如果你只在一個標籤內顯示它,那麼你可以配置標籤爲你截斷它。你甚至可以允許標籤縮小字體大小以適應文本以防止截斷。 –

+0

我正在繪製它,需要在其末尾添加一個省略號。我也想包裹引號,所以drawInRect withLineBreakMode不是一個選項在這裏,因爲它會切斷結束報價.. – Snowman

+0

Thx兄弟你的鏈接上面..我瘋狂搜索我的問題解決方案,但最終發現它在你的帖子.. – Rendy

回答

2

我敢肯定,這條線是錯誤的:

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

這意味着,每一個傳球,你只檢查字符串的大小從minmid - 這不是說你要結束顯示,雖然該字符串,因爲當你搜索你應該始終測試從字符串的開頭開始min在前進了繩子:

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

這是您在搜索完成後要返回的內容。

+0

啊是的,這是問題!謝謝! – Snowman

+3

請注意'[string substringToIndex:mid]'將爲您節省創建NSRange的步驟。 – benzado

相關問題