2016-12-29 156 views
0

我在macOS上使用Swift 3/Xcode 8。使用Swift将文本添加到CGContext

我重写draw在的NSView和,使用当前上下文,我能够得出简单的形状(见代码):

类样品: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)。所以我可能会错过一些非常明显的东西。

问题在于属性中的颜色分配。 用现在有效的代码进行编辑。

+0

“我什么也没找到,将编制” - 请**显示代码**如果你有麻烦的东西进行编译。我们无法帮助您处理不可用的代码。 (此外,“似乎没有人真正绘制它”似乎意味着你已经设法运行代码,但在屏幕上看不到任何东西。) – jtbandes

+0

请检查以下这些方法:https://developer.apple.com/library/ content/documentation/Cocoa/Conceptual/AttributedStrings/Tasks/DrawingAttrStrings.html – jtbandes

+0

你现在的图形代码真的没有'stroke' /'fill'调用吗? – jtbandes

回答

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) 
    } 
} 

结果:

enter image description here

+0

我曾经尝试过,但我坦白地不记得它是如何为我工作的。也许它不可能使它与cgContext一起工作。所以我会再试一次并回复你。 –

+0

好吧,我再试一次。它失败了,“我发现无法识别的选择器发送到实例”错误,我怀疑是不是参考上下文的事情。还是)感谢你的建议。 –

+0

我真的不知道你是什么意思。当然,它的作品。我编辑了我的答案,以显示一些示例代码和正在运行的应用程序中的可见绘图。 – matt