objective-c - NSString 绘图与 String 作为 NSBezierPath 绘图

标签 objective-c cocoa nsbezierpath

我需要对(可能是巨大的)数量的组件执行有效的 HitTest ,因此我将所有原语表示为 NSBezierPath 实例。到目前为止一切进展顺利。

现在我在转换 NSString 对象时遇到问题,特别是反射(reflect)它们在 View 中的位置: 我使用 Apple 的 SpeedometerView 示例中的 NSString (BezierConversions) 类别将字符串转换为贝塞尔曲线路径。

为字符串创建的贝塞尔路径看起来很棒,但将其定位以匹配 View 中 NSString 实例位置的位置不太有效,所以我想这个问题实际上是关于

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

相同的属性,相同的输入位置,不同的 View 位置。
旋转文本后情况会变得更糟。


更新#1

看起来它归结为

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

现在正在尝试使用NSStringboundingRectWithSize

最佳答案

FWIW - 正在工作。

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

将从 bezierWithFont: 返回的 NSBezierPath 偏移该量,然后就可以开始了..

关于objective-c - NSString 绘图与 String 作为 NSBezierPath 绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9868498/

相关文章:

objective-c - 如何在 mac 中查找登录和注销事件?

objective-c - OS X 菜单栏应用程序 : How to bring window to front

objective-c - 扩展 NSTableView

swift - 如何使用 bezierPathWithCGPath Swift

ios - 获取 UIBezierpath 的中心点

objective-c - NSTask 返回 HTTP header

ios - 如何在不卸载 Xcode 的情况下删除 iOS 模拟器

macos - 联系方式以及安全和隐私

objective-c - 核心数据和 NSPersistentDocument : Sum of column numbers crash

objective-c - 有没有办法获取 NSBezierPath 对象所有点的 x,y 坐标?