3

(潜在的に膨大な) 数のコンポーネントに対して効率的なヒット テストを実行する必要があるため、すべてのプリミティブをNSBezierPathインスタンスとして表現しました。これまでのところ、すべてうまくいっています。

現在、オブジェクトの変換NSString、特にビュー内での位置の反映に問題がありNSString (BezierConversions)ます。Apple の SpeedometerView の例のカテゴリを使用して、文字列をベジエ パスに変換しています。

文字列用に作成されたベジエ パスは見栄えがしNSStringますが、ビュー内のインスタンスの場所の位置に一致するように配置することはうまく機能しないため、この質問は実際には

  • NSBezierPathそしてtransformUsingAffineTransform:対。
  • NSAffineTransformビューに適用されたものとの組み合わせNSString drawAtPoint:

私のテストプロジェクトでは、些細なケースでも失敗します:

紫 = NSString drawAtPoint、灰色 = NSBezierPath 塗りつぶし

以下を使用して描画された文字列の灰色のベジエ表現:

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

と紫の文字列経由

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

同じ属性、同じ入力位置、ビュー内の異なる場所。
そして、回転したテキストではさらに悪化します。


更新 #1

によって返されるさまざまな境界ボックスに煮詰めているようです

  • NSString sizeWithAttributes:
  • NSBezierPath bounds

NSString現在、 boundingRectWithSizeを試しています

4

1 に答える 1

1

FWIW-現在作業中です。

このオプションを使用boundingRectWithSize:options:attributes:すると、NSStringDrawingUsesDeviceMetrics描画時に文字列が占める実際の境界ボックスや最初のグリフのオフセットなど、操作に適したテキストの寸法が得られます。

NSBezierPathbezierWithFontから返されたものをその量だけオフセットしてください。

于 2012-03-29T09:13:42.410 に答える