2012-05-21 23 views
5

Doğrusal yöntem çok yavaş olduğu için code found here'u bir ikili algoritmaya dönüştürmeye çalışıyorum. Çalıştığım bir uygulama var, ama eksik olan bir şey var gibi görünüyor, çünkü elde ettiğim sonuçlar kesin değil (yani, genişlikten 20 veya daha fazla piksel ekler veya çıkarırsam, aynı kesilmiş olurum) string..it biraz daha doğru ve daha yakından kesim) sahip olmalıdır:Bir NSString'i genişliğe doğru kırpın

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

kimse bunda yanlış ne olabilir yarasa kapalı görebilir mi? (Bu kategori yöntemidir, bu nedenle self bir NSString olduğunu

+0

Bunu neden kendiniz hesaplamanız gerekiyor? Dize ile ne yapıyorsun? Yalnızca bir etiketin içinde gösteriliyorsanız, etiketi sizin için kesecek şekilde yapılandırabilirsiniz. Etiketin kesilmeyi önlemek için metne sığdırmak için yazı tipi boyutunu küçültmesine bile izin verebilirsiniz. –

+0

Çizim yapıyorum ve sonunda bir elips eklemek gerekiyor. Ben de onun etrafında tırnak sarmak istiyorum, bu yüzden drawInRect withLineBreakMode burada bir seçenek değil, çünkü son alıntıyı keserdi .. – Snowman

+0

Yukarıdaki bağlantı için Thx dude ... Benim deli gibi sorun çözüm aradı ama sonunda bulundu Gönderinizde .. – Rendy

cevap

2

bu hat yanlış eminim.

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

Bu, her geçiş, sadece dize boyutunu inceleyerek olduğumuz anlamına gelir minmid ila - sen hep dizinin başlangıcından itibaren test edilmesi gerektiğini arama yaparken min dize kadar yürüyen çünkü o, sen olsa sergilemenin ötesine gidiyoruz dize değil:.

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

, aramanız bittiğinde geri döneceğiniz şeydir.

+0

Ah evet bu sorun oldu! Teşekkürler! – Snowman

+3

Not: [string substringToIndex: mid] 'size bir NSRange oluşturma adımını kaydedecektir. – benzado

İlgili konular