2012-03-26 29 views
2

私はすべてのプリミティブをNSBezierPathインスタンスとして表しているので、(潜在的に巨大な)数のコンポーネントに対して効率的なヒットテストを実行する必要があります。これまでのすべての素晴らしい作業。 私はベジェパスに文字列を変換するために、AppleのSpeedometerView例からNSString (BezierConversions)カテゴリを使用しています:NSString描画とNSBezierPath描画の文字列

は今、私は特に、ビュー内の自分の位置を反映して、NSStringオブジェクトを変換し、トラブルを抱えています。

文字列を作成したベジェパスは偉大に見えますが、それはビューでNSStringインスタンスの場所の位置と一致するように位置決めするので、かなりのない仕事をして、私はこの質問は本当にについて

  • NSBezierPathtransformUsingAffineTransform:対であると仮定。
  • ビューに適用NSAffineTransformの組み合わせと私のテストプロジェクトでNSString drawAtPoint:

でも些細なケースが失敗しました:

Purple = NSString drawAtPoint, Grey = NSBezierPath fill

グレーベジェ用いて描画された文字列の表現:

NSAffineTransform *moveFinal = [NSAffineTransform transform]; 
[moveFinal translateXBy:x yBy:y]; 
[textBezier transformUsingAffineTransform:moveFinal]; 

[testString drawAtPoint:NSMakePoint(x, y) 
     withAttributes:attributes]; 

同じ属性、同じ入力位置、ビュー内の異なる位置を介して紫ストリング。
これは回転したテキストでは悪化します。それが今NSString BOで実験

  • NSString sizeWithAttributes:
  • NSBezierPath bounds

によって返さ異なるバウンディングボックスまで沸騰しているよう


UPDATE#1

が見えますundingRectWithSize

+0

境界は、テキストのサイズと同じではありません。..行ってもいいです:オフセットNSBezierPath

がbezierWithFontから返されました。たとえば、大きなローマ字のイタリック* f *は、 'NSAttributedString size'によって返されるボックスの境界をはるかに超えて描画します。 – hamstergene

+0

それで、私は 'boundingRectWithSize'に切り替えました。さまざまなフォントの寸法についての良いイントロは、[ここ](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/FontHandling/Tasks/GettingFontMetrics)で見つけることができます。html)ここで、sizeWithAttributesは外側の境界ボックスを使用し、NSBezierPath boundsはグリフが占める実際の領域を使用します。 – Jay

答えて

0

FWIW - 作業中です。

boundingRectWithSize:options:attributes:NSStringDrawingUsesDeviceMetricsオプションを使用すると、描画する文字列が占める実際の境界ボックスや最初のグリフのオフセットなど、適切なテキストサイズが得られます。その分だけ、あなたは、図面の