如何在CGContext中绘制String?

Mel*_*ius 4 calayer cgcontext ios swift

我正在尝试在(我正在为iOS编程)的重写draw方法中绘制字符串CALayer

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))
}
Run Code Online (Sandbox Code Playgroud)

但是,这没有画任何东西(至少看不到任何东西)。更改填充和描边颜色没有任何区别。

如果我画一条线,它将显示出来,因此该函数被调用。我知道有一个,CATextLayer但是我需要直接绘制字符串。CGContext在Swift 4时代,您应该如何画线?没有大量的网络搜索可以得出答案。

E.C*_*oms 5

我假设您知道所有其他设置。这里的关键是您尚未将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()
}
Run Code Online (Sandbox Code Playgroud)

  • 这解决了它。非常感谢!我觉得很困惑`CGContext`有各种各样的绘制方法,但没有做基本的文本绘制。 (2认同)

Moo*_*ose 5

如果视图聚焦,则上述答案有效。

不幸的是,它不能在屏幕外位图或 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 = [.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()
    }
}
Run Code Online (Sandbox Code Playgroud)

干杯:)

  • FWIW,在最近的 Swift 版本中,您需要这样的东西: `let attribute: [NSAttributedString.Key : Any]` (2认同)