NSString绘图与String作为NSBezierPath绘图

时间:2012-03-26 07:57:52

标签: objective-c cocoa nsbezierpath

我需要对(可能很大的)组件执行有效的命中测试,因此我将所有原语表示为NSBezierPath个实例。到目前为止一切都很好。

现在我无法转换NSString个对象,特别是反映了它们在视图中的位置: 我正在使用Apple的SpeedometerView示例中的NSString (BezierConversions)类别将字符串转换为贝塞尔路径。

为字符串创建的bezier路径看起来很棒但是将其定位以匹配视图中NSString实例位置的位置并不完全有效所以我想这个问题实际上是关于

  • NSBezierPathtransformUsingAffineTransform: vs.
  • 应用于视图的NSAffineTransformNSString 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];

相同属性,相同输入位置,视野中的不同位置 旋转的文字会变得更糟

更新#1

看起来它正在沸腾到

返回的不同边界框
  • NSString sizeWithAttributes:
  • NSBezierPath bounds

现在尝试使用NSString boundingRectWithSize

1 个答案:

答案 0 :(得分:0)

FWIW - 现在工作。

boundingRectWithSize:options:attributes:NSStringDrawingUsesDeviceMetrics选项一起使用可以提供一些好的文本维度,包括绘制时字符串占用的实际边界框以及第一个字形的偏移量。

抵消bezierWithFont返回的NSBezierPath:按这个数量计算,你很高兴..