3

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

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

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

  • NSBezierPathtransformUsingAffineTransform:对比
  • 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

现在尝试使用NSStringboundingRectWithSize

4

1 回答 1

1

FWIW - 现在工作。

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

抵消NSBezierPath从 bezierWithFont: 返回的金额,你很高兴..

于 2012-03-29T09:13:42.410 回答