5

我正在尝试将此处找到的代码转换为二进制算法,因为线性方法非常慢。我有一个有效的实现,但似乎有些东西我错过了,因为我得到的结果并不精确(也就是说,如果我从宽度中添加或减去 20 个左右的像素,我会得到相同的截断字符串..它应该更准确一些并且更接近):

-(NSString*)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont*)font addQuotes:(BOOL)addQuotes
{
    int min = 0, max = self.length, mid;
    while (min < max) {
        mid = (min+max)/2;

        NSString *currentString = [self substringWithRange:NSMakeRange(min, mid - min)];
        CGSize currentSize = [currentString sizeWithFont:font];

        if (currentSize.width < width){
            min = mid + 1;
        } else if (currentSize.width > width) {
            max = mid - 1;
        } else {
            min = mid;
            break;
        }
    }
    return [self substringWithRange:NSMakeRange(0, min)];
}

任何人都可以看到蝙蝠有什么问题吗?(这是一个类别方法,selfNSString 也是。

4

1 回答 1

2

我很确定这条线是错误的:

[self substringWithRange:NSMakeRange(min, mid - min)];

这意味着每次通过时,您只检查从minto的字符串的大小mid——但这不是您最终要显示min的字符串,因为在搜索时正在向上移动字符串。您应该始终从字符串的开头开始进行测试:

[self substringWithRange:NSMakeRange(0, mid)];

这是您完成搜索后要返回的内容。

于 2012-05-22T01:40:12.223 回答