不要与NSString sizeWithFont
返回 a 的方法混淆CGSize
,我正在寻找的是一个返回 aNSString
约束到某个的方法CGSize
。我想这样做的原因是,当用 绘制文本时Core Text
,我可以在字符串的末尾附加一个省略号 (...)。我知道NSString's drawInRect
方法为我做这个,但我正在使用Core Text
, 并kCTLineBreakByTruncatingTail
截断每行的结尾而不是字符串的结尾。
我发现有一种方法可以将字符串截断到一定的宽度,并且更改它以使其适用于 a 并不难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;
}
问题是,当它有空闲空间时,这有时会将字符串剪得太短。我认为这是最后一个条件发挥作用的地方。我如何确保它不会切断太多?