52

固定幅のボックスで NSAttributedStrings の描画を行いたいのですが、描画時に使用される適切な高さを計算するのに問題があります。これまでのところ、私は試しました:

  1. を呼び出し- (NSSize) sizeますが、文字列が望む幅を与えるため、結果は(この目的では)役に立ちません。

  2. 図面で使用しているのとまったく同じように、- (void)drawWithRect:(NSRect)rect options:(NSStringDrawingOptions)options必要な幅とオプションで形作られた四角形で呼び出します。NSStringDrawingUsesLineFragmentOrigin結果は...わかりにくいです。確かに私が探しているものではありません。(このCocoa-Dev スレッドを含む多くの場所で指摘されているように)。

  3. 一時的な NSTextView の作成と実行: tmpView のフレームを照会すると、幅は希望どおりであり、高さは多くの場合正しいです...長い文字列になるまで、必要なサイズの半分になることがよくあります。(ヒットする最大サイズはないようです。1 つのフレームは高さが 273.0 (約 300 では短すぎます)、もう 1 つのフレームは 478.0 (わずか 60 程度では短すぎます) になります)。
    [[tmpView textStorage] setAttributedString:aString];
    [tmpView setHorizontallyResizable:NO];
    [tmpView sizeToFit];

他の誰かがこれを管理している場合は、ポインタをいただければ幸いです。

4

12 に答える 12

30
-[NSAttributedString boundingRectWithSize:options:]

すべてのグリフ境界の結合NSStringDrawingUsesDeviceMetricsを取得するように指定できます。

とは異なり-[NSAttributedString size]、返さNSRectれる は、文字列が描画された場合に変化する領域の寸法を表します。

@Bryan がコメントしているようにboundingRectWithSize:options:、OS X 10.11 以降では非推奨 (非推奨) です。これは、コンテキストに応じて文字列のスタイルが動的になったためです。

OS X 10.11 以降については、Apple のCalculating Text Height開発者ドキュメントを参照してください。

于 2010-03-17T05:33:48.457 に答える
14

答え使用することです
- (void)drawWithRect:(NSRect)rect options:(NSStringDrawingOptions)options
が、rect渡すのは無制限にしたい次元で0.0でなければなりません(これは完全に理にかなっています)。ここの例。

于 2010-02-17T20:34:54.933 に答える
0

attributedTextの高さと幅を見つけるヘルパークラスを見つけました(テスト済みコード)

https://gist.github.com/azimin/aa1a79aefa1cec031152fa63401d2292

上記のファイルをプロジェクトに追加します

使い方

let attribString = AZTextFrameAttributes(attributedString: lbl.attributedText!)
let width : CGFloat = attribString.calculatedTextWidth()
print("width is :: >> \(width)")
于 2018-05-25T10:49:05.413 に答える