19

質問する前に、これは Apple のドキュメント re: how to determine the width of a string using Quartz: からのものです。

アプリケーションにとってテキストの測定値が重要な場合は、Quartz 2D 関数を使用してそれらを計算することができます。とはいえ、文字のレイアウトや採寸に強みを持つATSUIをまずは検討してみてはいかがでしょうか。ATSUI には、テキスト メトリックを取得する関数がいくつかあります。レイアウト後のテキスト メトリックを取得できるだけでなく、必要に応じて、レイアウト前のテキスト メトリックを取得することもできます。自分で計算しなければならない Quartz とは異なり、ATSUI は測定値を計算します。たとえば、ATSUI 関数 ATSUMeasureTextImage を呼び出すことによって、テキストのイメージ境界四角形を取得できます。

Quartz のテキストが ATSUI (または Cocoa) よりもニーズに適していると判断した場合は、次の手順に従って、Quartz がテキストを描画する前にテキストの幅を測定できます。

  1. 関数 CGContextGetTextPosition を呼び出して、現在のテキスト位置を取得します。
  2. 関数 CGContextSetTextDrawingMode を使用して、テキスト描画モードを kCGTextInvisible に設定します。
  3. 関数 CGContextShowText を呼び出してテキストを描画し、現在のテキスト位置にテキストを描画します。
  4. 関数 CGContextGetTextPosition を呼び出して、最終的なテキスト位置を決定します。
  5. テキストの幅を決定するには、終了位置から開始位置を引きます。

ここに私の質問があります:

  1. これは本当に Core Graphics を使用して文字列の幅を決定する最良の方法ですか? 私のテキストは 2D グラフィック要素と共存しているので、すべてのレンダリングに同じコンテキストを使用したいと考えています。次のようなコンパクトな方法があることを望んでいました。

    CGContextGetTextWidthAndHeight(context, text);
    
  2. ATSUI は時代遅れで、Core Text に置き換わろうとしていると読みました。それは本当ですか?もしそうなら、それはiOSにありますか?

4

2 に答える 2

22

iPhone SDK には、NSString必要なものを提供する一連のメソッドがあります。

iOS 7.0 の時点で、これらのメソッドは次のとおりです。

- boundingRectWithSize:options:attributes:context:
- sizeWithAttributes:

iOS の古いバージョンでは、これらがありましたが、現在は廃止されています。

– sizeWithFont:  
– sizeWithFont:forWidth:lineBreakMode:  
– sizeWithFont:constrainedToSize:  
– sizeWithFont:constrainedToSize:lineBreakMode:  
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
于 2009-05-27T00:55:56.100 に答える
0

UI スレッド以外のスレッドで描画操作を実行する場合は、説明した手法を使用する必要があります。これは、バックグラウンド スレッドで非同期にレンダリングを実行する CATiledLayer などを使用する場合、またはその他の理由でバックグラウンドでカスタム グラフィックスを描画する場合に特に注意することが重要です。

「単純な」グラフィックスを実行していて、メインスレッドで実行されることが保証されている場合、私は PGB に同意します。ただし、 sizeWithFont は、説明した手法と同じことを行っています.UIGraphicsGetCurrentContext()を使用してそれを行っているだけです。

于 2010-10-19T08:18:36.853 に答える