【发布时间】:2018-10-29 13:57:23
【问题描述】:
我正在使用 CoreGraphics 在 CGContext 中与图元一起绘制单个字形。以下代码在 XCode 9.2 中的 swift playground 中运行当在 Playground 中启动时,一个带有两倍字母 A 的小矩形应出现在 Playground liveView 中的给定坐标处。
import Cocoa
import PlaygroundSupport
class MyView: NSView {
init(inFrame: CGRect) {
super.init(frame: inFrame)
}
required init?(coder decoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
// setup context properties
let context: CGContext = NSGraphicsContext.current!.cgContext
context.setStrokeColor(CGColor.black)
context.setTextDrawingMode(.fill)
context.setFillColor(CGColor(red: 0.99, green: 0.99, blue: 0.85, alpha: 1))
context.beginPath()
context.addRect(rect)
context.fillPath()
context.setFillColor(.black)
// prepare variables and constants
var font = CTFontCreateWithName("Helvetica" as CFString, 48, nil)
var glyph = CTFontGetGlyphWithName(font, "A" as CFString)
var glyph1Position = CGPoint(x: self.frame.minX, y: self.frame.maxY/2)
var glyph2Position = CGPoint(x: self.frame.minX+150, y: self.frame.maxY/2)
let text = "Hello"
var textOrigin = NSPoint(x: self.frame.minX+50, y: self.frame.maxY/2)
// draw one character
CTFontDrawGlyphs(font, &glyph, &glyph1Position, 1, context)
// *** *** when the next line is uncommented the bug appears *** ***
// text.draw(at: textOrigin)
CTFontDrawGlyphs(font, &glyph, &glyph2Position, 1, context)
}
}
var frameRect = CGRect(x: 0, y: 0, width: 200, height: 100)
PlaygroundPage.current.liveView = MyView(inFrame: frameRect)
现在我想在相同的上下文中绘制常规文本。但是,当通过自己的绘图方法在两个字形的绘制之间绘制文本字符串时,当前的上下文似乎乱七八糟,第二个字形不会显示。在绘制两个单个字形之后绘制文本时,一切都很好。
所以很明显,绘制文本似乎对当前的 CGContext 有影响,但我无法弄清楚到底发生了什么。我在绘制字符串并在之后恢复之前尝试了 saveGstate() 方法,但没有成功。
我还尝试使用 CoreText 方法使用 CTFramesetterCreateWithAttributedString 创建属性字符串并使用 CTFramesetterCreateFrame 显示它,它也不起作用,这里在创建框架设置器后上下文混乱了。
我的实际操场更复杂,字形并没有完全消失,而是显示在错误的垂直位置,但基本问题 - 问题是一样的:
如何在不对背景进行任何其他更改的情况下将文本绘制到 currentContext 中?
【问题讨论】:
标签: swift text core-graphics draw glyph