2010-02-15 66 views
6

在UILabel中有使用不同截斷技術截斷標籤的功能(UILineBreakMode)。在NSString UIKit Additions中,有一個類似的繪製字符串的功能。如何截斷基於圖形寬度的NSString?

但是,我發現沒有辦法訪問實際的截斷字符串。有沒有其他方法可以根據給定字體的(圖形)寬度獲取截斷字符串?

我想有這個方法上的NSString類別:

-(NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode 

回答

6

一種選擇是由循環,直到你得到正確的寬度嘗試不同的尺寸。即從完整的字符串開始,如果這比所需要的寬,用省略號字符替換最後兩個字符。循環直到足夠窄。

如果您認爲您將使用長字符串,則可以使用二分法搜索您的截斷點以使其更快一些。

+0

謝謝烏利,好主意。奇蹟般有效。請參閱其他評論中的代碼。 –

17
- (NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode { 
    NSMutableString *resultString = [[self mutableCopy] autorelease]; 
    NSRange range = {resultString.length-1, 1}; 

    while ([resultString boundingRectWithSize:CGSizeMake(FLT_MAX, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size.width > width) { 
     // delete the last character 
     [resultString deleteCharactersInRange:range]; 
     range.location--; 
     // replace the last but one character with an ellipsis 
     [resultString replaceCharactersInRange:range withString:truncateReplacementString]; 
    } 
    return resultString; 
} 

請注意,由於iOS 6此方法不再安全地在後臺線程上運行。

+0

可能應該更新iOS方法 - boundingRectWithSize:options:attributes:context:,由於棄用。 – skyylex

+0

@skyylex確實。完成。 –