【问题标题】:Adding text to a CGContext with Swift使用 Swift 将文本添加到 CGContext
【发布时间】:2016-12-29 04:09:42
【问题描述】:

我在 macOS 上使用 Swift 3 / Xcode 8。

我在 NSView 中覆盖 draw,并且使用当前上下文,我能够绘制简单的形状(参见代码):

类示例:NSImageView {

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
    let context = NSGraphicsContext.current()?.cgContext;
    let length = CGPoint(x: 100, y: 100)
    let p1 = CGPoint(x: 200, y: 200)
    let shape = "square"


    context!.beginPath()
    context!.move(to: p1)

    if shape == "line" {
        let pointEnd = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
        context!.addLine(to: pointEnd)
    } else if shape == "square" {
        let p2 = CGPoint(x: p1.x + length.x, y: p1.y)
        let p3 = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
        let p4 = CGPoint(x: p1.x, y: p1.y + length.y)
        context!.addLine(to: p2)
        context!.addLine(to: p3)
        context!.addLine(to: p4)
        context!.addLine(to: p1)
    }

    context!.setStrokeColor(red: 1, green: 1, blue: 1, alpha: 1.0)
    context!.setFillColor(red: 0, green: 1, blue: 0, alpha: 1)
    context!.setLineWidth(2.0)
    context!.strokePath()

    let textColor = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 1.0)
    let textColorB = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 0.0)
    let rect = CGRect(x: 200, y: 200, width: 30, height: 130)
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = .center
    let attr = [NSParagraphStyleAttributeName: paragraphStyle, NSForegroundColorAttributeName: textColor, NSBackgroundColorAttributeName: textColorB, NSFontAttributeName:NSFont.init(name: "HelveticaNeue-Thin", size: 14)]

    let q: NSString = "hello, world"
    let center = CGPoint(x: 0, y: 0)
    q.draw(at: center, withAttributes: attr)                                                                 
}

以上内容已更正以显示整个方法。

除文本绘制外,这按预期工作。最后两行显示了我尝试的两次平局。第一个如下所示,它崩溃了(请参阅该行的评论消息)。第二个很接近,但它需要 NSDrawingContext,而不是 CGContext。

我还想画一些文字(比如就在线条下方)。我做了很多搜索,但没有发现任何有用的东西。 CGContexts 似乎有与绘制文本相关的方法,但似乎没有一个真正绘制它。明确地说,我没有发现任何可以编译的东西,更不用说运行了。

注意:我是 macOS 开发的新手(虽然做过一些 iOS)。所以我可能会遗漏一些非常明显的东西。

问题在于属性中的颜色分配。 使用现在可以工作的代码进行编辑。

【问题讨论】:

  • “我没有发现任何可以编译的东西”——如果您在编译时遇到问题,请显示代码。对于不可用的代码,我们无法为您提供帮助。 (此外,“似乎没有人真正绘制它”似乎意味着您确实设法运行了代码,但在屏幕上什么也没看到。)
  • 如果没有stroke/fill 调用,您当前的绘图代码真的可以工作吗?
  • 无法绘制它意味着有诸如“setTextPosition”之类的方法建议连接但实际上没有绘制。
  • 显示的代码缺少笔画。对不起。

标签: swift macos core-graphics cgcontext


【解决方案1】:

将文本绘制到当前图形上下文中的简单方法是使用 NSString 的draw(at:withAttributes:)

例子:

class MyView : NSView {
    override func draw(_ dirtyRect: NSRect) {
        let atts = [NSFontAttributeName:NSFont.init(name: "Georgia", size: 30)]
        ("Hello world" as NSString).draw(
             at: NSMakePoint(100,100), 
             withAttributes: atts)
    }
}

结果:

【讨论】:

  • 我记得我确实尝试过,但坦率地说,我不记得它为什么不适合我。也许不可能使它与 cgContext 一起工作。所以我会再试一次并回复你。
  • 好的,我又试了一次。它失败并出现“将无法识别的选择器发送到实例”错误,我怀疑这是不引用上下文的原因。不过,感谢您的建议。
  • 我真的不明白你的意思。当然可以。我已经编辑了我的答案以在正在运行的应用程序中显示一些示例代码和可见的绘图。
  • 是的,它确实有效,即使现在对我来说也是如此。我的问题在于我将文本颜色分配为 CGColor.white。当我将其替换为:
  • 如何声明这是我想要的答案?
猜你喜欢
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多