使用 CoreText 绘图时禁用混合
Disable blending when drawing with CoreText
我正在使用 CoreText 在灰色背景上绘制黑色文本。
似乎系统会自动对字形进行一些混合,我想尽可能禁用此行为,但我不确定如何。
这是字母 L 顶部的放大屏幕截图。这是我要禁用的混合
绘制代码如下:
let para = NSMutableParagraphStyle()
para.alignment = .center
let attrString = NSAttributedString(string: Configuration.trainString,
attributes: [
.font:UIFont.boldSystemFont(ofSize: size.height*0.8),
.paragraphStyle:para
])
let framesetter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)
let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil)
CTFrameDraw(frame, ctx)
let cgImage = ctx.makeImage()
return cgImage
有没有办法在仍然利用 CoreText 的同时做到这一点?
编辑:可能 this 是相关的,但我相信这个问题仍然有效。这个问题可以用代码明确回答,而以前没有提供代码。我已经将 framesetter 使用的路径四舍五入为积分(以及字体大小)
运行 在 Swift 游乐场中的完整代码要点已发布 HERE
这可能看起来很明显,但值得重复的是 CTFrameDraw(_:_:)
is ultimately just performing operations on CGContext
因此它的文本功能是必不可少的。
根据您想要的细节,我建议您在 CGContext
上试验字体平滑功能,从 setAllowsFontSmoothing(_:)
开始。
编辑
使用你的游乐场,我找到了一个具体的解决方案。在绘制文本之前添加 setAllowsAntialiasing:
ctx.setAllowsAntialiasing(false)
CTFrameDraw(frame, ctx)
我正在使用 CoreText 在灰色背景上绘制黑色文本。 似乎系统会自动对字形进行一些混合,我想尽可能禁用此行为,但我不确定如何。
这是字母 L 顶部的放大屏幕截图。这是我要禁用的混合
绘制代码如下:
let para = NSMutableParagraphStyle()
para.alignment = .center
let attrString = NSAttributedString(string: Configuration.trainString,
attributes: [
.font:UIFont.boldSystemFont(ofSize: size.height*0.8),
.paragraphStyle:para
])
let framesetter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)
let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil)
CTFrameDraw(frame, ctx)
let cgImage = ctx.makeImage()
return cgImage
有没有办法在仍然利用 CoreText 的同时做到这一点?
编辑:可能 this 是相关的,但我相信这个问题仍然有效。这个问题可以用代码明确回答,而以前没有提供代码。我已经将 framesetter 使用的路径四舍五入为积分(以及字体大小)
运行 在 Swift 游乐场中的完整代码要点已发布 HERE
这可能看起来很明显,但值得重复的是 CTFrameDraw(_:_:)
is ultimately just performing operations on CGContext
因此它的文本功能是必不可少的。
根据您想要的细节,我建议您在 CGContext
上试验字体平滑功能,从 setAllowsFontSmoothing(_:)
开始。
编辑
使用你的游乐场,我找到了一个具体的解决方案。在绘制文本之前添加 setAllowsAntialiasing:
ctx.setAllowsAntialiasing(false)
CTFrameDraw(frame, ctx)