15

CoreText では、「特定の四角形に、この属性付き文字列がどのくらい収まるか?」と尋ねるのは簡単です。

CTFrameGetVisibleStringRange(rect).length

文字列内で次のテキストの実行を開始する場所を返します。

私の質問は、「属性付きの文字列と幅が与えられた場合、属性付きの文字列を完全にバインドするには、どのような四角形の高さが必要ですか?」です。

CoreText フレームワークはこれを行うためのツールを提供していますか?

ありがとう、
ダグ

4

1 に答える 1

22

必要なのは ですCTFramesetterSuggestFrameSizeWithConstraints()。次のように使用できます。

CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(attributedString)); /*Create your framesetter based in you NSAttrinbutedString*/
CGFloat widthConstraint = 500; // Your width constraint, using 500 as an example
CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(
   framesetter, /* Framesetter */
   CFRangeMake(0, text.length), /* String range (entire string) */
   NULL, /* Frame attributes */
   CGSizeMake(widthConstraint, CGFLOAT_MAX), /* Constraints (CGFLOAT_MAX indicates unconstrained) */
   NULL /* Gives the range of string that fits into the constraints, doesn't matter in your situation */
);
CGFloat suggestedHeight = suggestedSize.height;

編集

//IMPORTANT: Release the framesetter, even with ARC enabled!
CFRelease(frameSetter);

ARC は Objective-C オブジェクトのみをリリースし、CoreText は C を扱うため、ここでメモリ リークが発生する可能性が非常に高くなります。あなたNSAttributedStringが小さく、一度それをすれば、悪い結果をもたらすべきではありません。しかし、たとえば 50 の高さの big/complex NSAttributedStrings を計算するループがあり、 を解放しない場合、CTFramesetterRef重大なメモリ リークが発生する可能性があります。メモリ リークと計測器を使用したデバッグの詳細については、リンクされているチュートリアルを確認してください。

したがって、この問題の解決策は追加することですCFRelease(frameSetter);

于 2011-08-10T16:27:03.657 に答える