使用 Swift 将文本添加到 CGContext
Adding text to a CGContext with Swift
我在 macOS 上使用 Swift 3 / Xcode 8。
我在 NSView 中重写 draw
,并且使用当前上下文,我能够绘制简单的形状(参见代码):
class 示例: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 似乎有与绘制文本相关的方法,但 none 似乎实际上是在绘制它。明确地说,我没有发现任何可以编译的东西,更不用说 运行.
注意:我是 macOS 开发的新手(虽然做了一些 iOS)。所以我可能遗漏了一些非常明显的东西。
问题出在属性的颜色分配上。
使用现在可用的代码进行编辑。
将文本绘制到当前图形上下文中的简单方法是使用 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)
}
}
结果:
我在 macOS 上使用 Swift 3 / Xcode 8。
我在 NSView 中重写 draw
,并且使用当前上下文,我能够绘制简单的形状(参见代码):
class 示例: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 似乎有与绘制文本相关的方法,但 none 似乎实际上是在绘制它。明确地说,我没有发现任何可以编译的东西,更不用说 运行.
注意:我是 macOS 开发的新手(虽然做了一些 iOS)。所以我可能遗漏了一些非常明显的东西。
问题出在属性的颜色分配上。 使用现在可用的代码进行编辑。
将文本绘制到当前图形上下文中的简单方法是使用 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)
}
}
结果: