如何在CGContext中绘制String?
How to draw String in CGContext?
我正在尝试在 CALayer
的覆盖 draw
方法中绘制一个字符串(我正在为 iOS 编程)。
override func draw(in ctx: CGContext) {
let font = UIFont.systemFont(ofSize: 30)
let string = NSAttributedString(string: "23", attributes: [NSAttributedStringKey.font: font])
string.draw(at: CGPoint(x: 200, y: 200))
}
然而,这并没有绘制任何东西(至少没有东西是可见的)。更改填充和描边颜色没有区别。
如果我画一条线它会显示,所以正在调用该函数。我知道有一个 CATextLayer
但我需要直接绘制字符串。在Swift 4时代,你应该如何在CGContext
中绘制字符串?网上搜索再多也没有答案。
我假设您知道所有其他设置。这里的关键是你没有将 CGContext 作为当前的。只需添加两行代码即可解决问题。希望你能得到答案。
override func draw(in ctx: CGContext) {
UIGraphicsPushContext(ctx)
let font = UIFont.systemFont(ofSize: 30)
let string = NSAttributedString(string: "23", attributes: [NSAttributedString.Key.font: font])
string.draw(at: CGPoint(x: 200, y: 200))
UIGraphicsPopContext()
}
如果聚焦视图,以上答案有效。
遗憾的是,它在离屏位图或 CALayer 上下文中不起作用。
在任何 CGContext 中绘制字符串的正确且通用的方法是使用 CoreText api。它将在所有 Apple 平台上运行,并且在引擎盖下具有强大的功能。
https://developer.apple.com/documentation/coretext
示例:
import Foundation
import Quartz
/// LazyFoxLayer
///
/// Will draw the "The lazy fox…" string in the bottom right corner of the layer,
/// with a margin of 10 pixels.
class LazyFoxLayer: CALayer {
func draw(ctx: CGContext) {
ctx.saveGState()
// Parameters
let margin: CGFloat = 10
let color = CGColor.black
let fontSize: CGFloat = 32
// You can use the Font Book app to find the name
let fontName = "Chalkboard" as CFString
let font = CTFontCreateWithName(fontName, fontSize, nil)
let attributes: [NSAttributedString.Key : Any] = [.font: font, .foregroundColor: color]
// Text
let string = "The lazy fox…"
let attributedString = NSAttributedString(string: string,
attributes: attributes)
// Render
let line = CTLineCreateWithAttributedString(attributedString)
let stringRect = CTLineGetImageBounds(line, ctx)
ctx.textPosition = CGPoint(x: bounds.maxX - stringRect.width - margin,
y: bounds.minY + margin)
CTLineDraw(line, ctx)
ctx.restoreGState()
}
}
干杯:)
我正在尝试在 CALayer
的覆盖 draw
方法中绘制一个字符串(我正在为 iOS 编程)。
override func draw(in ctx: CGContext) {
let font = UIFont.systemFont(ofSize: 30)
let string = NSAttributedString(string: "23", attributes: [NSAttributedStringKey.font: font])
string.draw(at: CGPoint(x: 200, y: 200))
}
然而,这并没有绘制任何东西(至少没有东西是可见的)。更改填充和描边颜色没有区别。
如果我画一条线它会显示,所以正在调用该函数。我知道有一个 CATextLayer
但我需要直接绘制字符串。在Swift 4时代,你应该如何在CGContext
中绘制字符串?网上搜索再多也没有答案。
我假设您知道所有其他设置。这里的关键是你没有将 CGContext 作为当前的。只需添加两行代码即可解决问题。希望你能得到答案。
override func draw(in ctx: CGContext) {
UIGraphicsPushContext(ctx)
let font = UIFont.systemFont(ofSize: 30)
let string = NSAttributedString(string: "23", attributes: [NSAttributedString.Key.font: font])
string.draw(at: CGPoint(x: 200, y: 200))
UIGraphicsPopContext()
}
如果聚焦视图,以上答案有效。
遗憾的是,它在离屏位图或 CALayer 上下文中不起作用。
在任何 CGContext 中绘制字符串的正确且通用的方法是使用 CoreText api。它将在所有 Apple 平台上运行,并且在引擎盖下具有强大的功能。
https://developer.apple.com/documentation/coretext
示例:
import Foundation
import Quartz
/// LazyFoxLayer
///
/// Will draw the "The lazy fox…" string in the bottom right corner of the layer,
/// with a margin of 10 pixels.
class LazyFoxLayer: CALayer {
func draw(ctx: CGContext) {
ctx.saveGState()
// Parameters
let margin: CGFloat = 10
let color = CGColor.black
let fontSize: CGFloat = 32
// You can use the Font Book app to find the name
let fontName = "Chalkboard" as CFString
let font = CTFontCreateWithName(fontName, fontSize, nil)
let attributes: [NSAttributedString.Key : Any] = [.font: font, .foregroundColor: color]
// Text
let string = "The lazy fox…"
let attributedString = NSAttributedString(string: string,
attributes: attributes)
// Render
let line = CTLineCreateWithAttributedString(attributedString)
let stringRect = CTLineGetImageBounds(line, ctx)
ctx.textPosition = CGPoint(x: bounds.maxX - stringRect.width - margin,
y: bounds.minY + margin)
CTLineDraw(line, ctx)
ctx.restoreGState()
}
}
干杯:)