如何根据图形宽度截断NSString?

在UILabel中,有使用不同截断技术(UILineBreakMode)截断标签的function。 在NSString UIKit Additions中,绘制字符串有类似的function。

但是,我发现无法访问实际的截断字符串。 有没有其他方法可以根据给定字体的(图形)宽度获取截断的字符串?

我希望用这种方法在NSString上有一个类别:

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

一种选择是通过循环尝试不同的大小,直到获得正确的宽度。 即以完整字符串开头,如果它比您需要的更宽,则用省略号字符替换最后两个字符。 循环直到它足够窄。

如果您认为自己将使用长字符串,则可以通过二进制搜索截断点来使其更快一些。

 - (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开始,此方法不再适用于在后台线程上运行。