2009-05-27 3 views
19

私は私の質問をする前に、これはAppleのドキュメントreからである:クォーツを使用して文字列の幅を決定する方法:iPhone SDK:Quartzを使用して文字列の幅と高さを測定するにはどうすればよいですか?

テキスト測定は、アプリケーションにとって重要である場合、それはクォーツを使用して計算する 可能です2D機能。ただし、最初に の強度をテキストレイアウトで使用し、 測定を使用することを検討してください。 ATSUIには、テキストメトリックを取得する関数がいくつかあります。 では、レイアウト後のテキストメトリックしか取得できませんが、まれに、 が必要です。レイアウト前のテキストメトリックを取得できます。 とは異なり、計算を自分で実行する必要があるため、ATSUI があなたのために測定値を計算します。たとえば、ATSUI関数 ATSUMeasureTextImageを呼び出すことによって、テキストの画像境界矩形 を取得できます。

あなたはクォーツテキストがATSUI(または ココア)よりももっと自分のニーズに合っていることを決定した場合、あなたは クォーツはそれを描画する前に、テキストの幅を測定するために、これらの手順に従うことができます:

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

私の質問です:

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

    CGContextGetTextWidthAndHeight(context、text);

  2. 私はATSUIが古く、コアテキストに置き換えられると読んでいます。それが本当ですか、そうなら、それはiPhone SDKにありますか? iPhone SDKで

+0

コアテキストがiOS 4で出荷されるようになりました。しかし、pgbの回答方法は最も簡単です。 – Eonil

答えて

22

、あなたが望むものを提供NSStringのメソッドの家族があります。 iOSの7.0、these methods areのよう

:私たちはこれらを持っていたのiOSの古いバージョンでは

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

、現在は非推奨:

– sizeWithFont: 
– sizeWithFont:forWidth:lineBreakMode: 
– sizeWithFont:constrainedToSize: 
– sizeWithFont:constrainedToSize:lineBreakMode: 
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 
+0

Core GraphicsコールとObjective-Cオブジェクトを混在させることはできませんでした。CGにはconst char配列に基づいて独自のテキスト描画関数がありますが、ベルやホイッスルは制限されています。 「現在のコンテキスト」とは、インスタンス化された最後のコンテキストを意味します。たとえば、次のようになります。 \t CGContextSetFillColorWithColor(context、color.CGColor); \t [text drawAtPoint:origin withFont:font]; 大きなアドバイスをいただきありがとうございます。 –

+1

実際には、現在のコンテキストでは、UIGraphicsGetCurrentContext()によって返されるコンテキストを意味していると確信しています。 –

+0

具体的な状況、具体的には、メインスレッド以外のスレッドからUI___(UIGraphicsGetCurrentContext()など)を呼び出すものは頻繁に失敗します。これは重大な問題です。特に、CATiledLayerのようなものを使用している場合、バックグラウンドスレッドで非同期にレンダリングされます。 – Steve

0

UIスレッド以外のスレッドで描画操作を実行するときは、あなたが記述したテクニックを使用しなければなりません。これは、CATiledLayerのようなものを使用して、バックグラウンドスレッドで非同期にレンダリングするとき、またはその他の理由でカスタムグラフィックをバックグラウンドで描画するときに注意するのが特に重要です。

「シンプルな」グラフィックスを実行していて、メインスレッドで動作することが保証されている場合、私はPGBに同意します。しかし、sizeWithFontは、あなたが記述したテクニックと同じことをしています - それは単にUIGraphicsGetCurrentContext()を使ってあなたのためにやっています。

関連する問題