NSString sizeWithFont
を返すメソッドと混同しないようにCGSize
、私が探しているのはNSString
、特定の に制約されたを返すメソッドですCGSize
。これを行う理由は、でテキストを描画するときCore Text
に、文字列の末尾に省略記号 (...) を追加できるようにするためです。メソッドがこれを行うことは知ってNSString's drawInRect
いますが、私は を使用しており、文字列の末尾ではなく各行Core Text
の末尾をkCTLineBreakByTruncatingTail
切り捨てています。
文字列を特定のwidthに切り詰めるこのメソッドが見つかりました。これを変更して a で機能させるのはそれほど難しくありませんが、アルゴリズムは長い文字列に対して信じられないほど遅く、実際には使用できません。(長い文字列を切り詰めるのに 10 秒以上かかりました)。これをより速く行うには、より「コンピューターサイエンス」/数学的なアルゴリズムの方法が必要です。より高速な実装を考え出すのに十分なほど大胆な人はいますか?CGSize
編集:これをバイナリアルゴリズムに組み込むことができました:
-(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;
}
問題は、これにより弦に余裕があるときに弦が短くなりすぎることがあるということです。これが最後の条件の出番だと思います。切りすぎないようにするにはどうすればよいですか?