必要なのは です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 NSAttributedString
s を計算するループがあり、 を解放しない場合、CTFramesetterRef
重大なメモリ リークが発生する可能性があります。メモリ リークと計測器を使用したデバッグの詳細については、リンクされているチュートリアルを確認してください。
したがって、この問題の解決策は追加することですCFRelease(frameSetter);