在UILabel中,有使用不同截断技术(UILineBreakMode)截断标签的功能。在NSString UIKit Additions中,绘制字符串的功能类似。
但是,我发现无法访问实际的截断字符串。有没有其他方法可以根据给定字体的(图形)宽度获得截断的字符串?
我想用这种方法在NSString上有一个类别:
-(NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode
答案 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开始,此方法不再适用于在后台线程上运行。
答案 1 :(得分:6)
一种选择是通过循环尝试不同的尺寸,直到获得正确的宽度。即从完整字符串开始,如果它比您需要的更宽,则用省略号字符替换最后两个字符。循环直到它足够窄。
如果您认为自己将使用长字符串,则可以使用二进制搜索方式来截断,以使其更快一些。