不要和返回CGSize的NSString sizeWithFont方法混淆,我需要的是一个可以返回NSString并限制在特定CGSize内的方法。我之所以想这么做,是因为在使用Core Text绘制文本时,我想在字符串末尾添加省略号(...)。我知道NSString的drawInRect方法可以为我实现这一点,但我正在使用Core Text,并且kCTLineBreakByTruncatingTail会截断每行的末尾而不是字符串的末尾。
问题在于有时候会把字符串截短了,即使还有空间。我想这就是最后一个条件发挥作用的地方。如何确保它不会截断太多?
我发现了一种字符串截断方法,可以将字符串截断到特定的宽度,并且很容易将其改为适用于CGSize
,但是对于长字符串,该算法非常慢,实际上无法使用。(截取一个长字符串需要超过10秒)。必须有更快的“计算机科学”/数学算法方式来完成这个任务。是否有人敢尝试提出更快的实现方式?
编辑:我已经将其转换为二进制算法:
-(NSString*)getStringByTruncatingToSize:(CGSize)size string:(NSString*)string withFont:(UIFont*)font
{
int min = 0, max = string.length, mid;
while (min < max) {
mid = (min+max)/2;
NSString *currentString = [string substringWithRange:NSMakeRange(min, mid - min)];
CGSize currentSize = [currentString sizeWithFont:font constrainedToSize:CGSizeMake(size.width, MAXFLOAT)];
if (currentSize.height < size.height){
min = mid + 1;
} else if (currentSize.height > size.height) {
max = mid - 1;
} else {
break;
}
}
NSMutableString *finalString = [[string substringWithRange:NSMakeRange(0, min)] mutableCopy];
if(finalString.length < self.length)
[finalString replaceCharactersInRange:NSMakeRange(finalString.length - 3, 3) withString:@"..."];
return finalString;
}
问题在于有时候会把字符串截短了,即使还有空间。我想这就是最后一个条件发挥作用的地方。如何确保它不会截断太多?
min> = max
,并且其中一个值是您想要的索引。 - benzado