2012-03-26 59 views
2

我需要对(可能巨大的)数量的组件执行高效的命中测试,因此我已将所有基元表示为NSBezierPath实例。迄今为止所有的工作都很棒NSString绘图与字符串作为NSBezierPath绘图

现在我无法转换NSString物体,特别是反映了他们在视图中的位置: 我使用苹果的SpeedometerView例如NSString (BezierConversions)类别字符串转换成贝塞尔路径。

字符串创建的贝塞尔曲线看起来很大,但它定位匹配在视图中NSString实例场所的位置完全不是那么回事,所以我想这个问题实际上是关于

  • NSBezierPathtransformUsingAffineTransform: VS 。
  • 应用的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]; 

相同的属性,相同的输入的位置,不同的位置在视紫字符串。
它旋转的文字变得更糟。


更新#1

看起来像它的熬煮返回不同的边框由

  • NSString sizeWithAttributes:
  • NSBezierPath bounds

现在用NSString试验博undingRectWithSize

+0

绘制的边界是不一样的文字的大小。例如,一个大的罗马斜体* f *将远远落后于'NSAttributedString size'返回的框的边界。 – hamstergene 2012-03-27 07:01:07

+0

是的,这就是为什么我切换到'boundingRectWithSize'。关于各种字体维度的好介绍可以在这里找到(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/FontHandling/Tasks/GettingFontMetrics。html)其中sizeWithAttributes似乎使用外边界框和'NSBezierPath bounds'这些字形占用的实际区域。 – Jay 2012-03-27 07:02:41

回答

0

FWIW - 正在工作。

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

偏移的NSBezierPath从bezierWithFont返回:由量,你是好去..