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)];
}

誰かがそれで何が悪いのかを見送ることができますか?(これはカテゴリメソッドであるためself、NSStringも同様です。

4

1 に答える 1

2

私はこの行が間違っているとかなり確信しています:

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

これは、すべてのパスで、からminまでの文字列のサイズのみを調べていることを意味します。ただし、検索すると文字列が行進するmidため、最終的に表示される文字列ではありません。min常に文字列の先頭からテストする必要があります。

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

これは、検索が完了したときに返されるものです。

于 2012-05-22T01:40:12.223 に答える