删除线在 macOS 上的 CoreText 中不起作用
Strikethrough not working in CoreText on macOS
未显示删除线,但显示下划线。代码如下,它相当简单。当我注释掉下划线时,文本显示时没有删除线,当我注释掉删除线并显示下划线时,它工作正常。我已经尝试了所有方法 — 我一定遗漏了一些明显的东西,文档说删除线应该有效。
我运行正在使用 macOS 10.13.6 和 Xcode 10.1。
import AppKit
import PlaygroundSupport
class CustomView: NSView {
override func draw(_ dirtyRect: NSRect) {
let attrString = NSAttributedString(
string: "Hello",
attributes: [
//NSAttributedString.Key.underlineStyle: NSUnderlineStyle.thick.rawValue,
NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.thick.rawValue
]
)
let line = CTLineCreateWithAttributedString(attrString)
// Set text position and draw the line into the graphics context.
let context = (NSGraphicsContext.current?.cgContext)!
context.translateBy(x: 10, y: 10)
CTLineDraw(line, context)
}
}
let customView = CustomView(frame: NSRect(x: 0, y: 0, width: 400, height: 400))
PlaygroundPage.current.liveView = customView
游乐场设置。要在 Xcode Playground 中 运行 只需确保在检查器设置中将平台更改为 macOS(所有新的 playground 默认设置为 iOS)。
CoreText not 原生支持 删除线 排版文本修饰(但支持下划线 就像您在问题中指出的那样)。 CoreText 支持的完整字符串属性列表是 described here.
这个旧的 Objective-C based blog post 提供了使用 CoreText API 手动实现删除线的必要细节。不幸的是,根本不是快速修复。
较高级别的 TextKit 框架 提供删除线支持。要快速查看工作情况,只需替换原始代码中的这一行:
CTLineDraw(line, context)
改为:
attrString.draw(at: .zero)
而且,顺便说一句,这在某种程度上有助于验证您的原始 NSAttributedString
开头没有任何问题 ;)
当然,根据您的代码对 CoreText 的依赖程度,切换到 TextKit 可能是一项非常重要的任务,因此您也需要牢记这一点。
未显示删除线,但显示下划线。代码如下,它相当简单。当我注释掉下划线时,文本显示时没有删除线,当我注释掉删除线并显示下划线时,它工作正常。我已经尝试了所有方法 — 我一定遗漏了一些明显的东西,文档说删除线应该有效。
我运行正在使用 macOS 10.13.6 和 Xcode 10.1。
import AppKit
import PlaygroundSupport
class CustomView: NSView {
override func draw(_ dirtyRect: NSRect) {
let attrString = NSAttributedString(
string: "Hello",
attributes: [
//NSAttributedString.Key.underlineStyle: NSUnderlineStyle.thick.rawValue,
NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.thick.rawValue
]
)
let line = CTLineCreateWithAttributedString(attrString)
// Set text position and draw the line into the graphics context.
let context = (NSGraphicsContext.current?.cgContext)!
context.translateBy(x: 10, y: 10)
CTLineDraw(line, context)
}
}
let customView = CustomView(frame: NSRect(x: 0, y: 0, width: 400, height: 400))
PlaygroundPage.current.liveView = customView
游乐场设置。要在 Xcode Playground 中 运行 只需确保在检查器设置中将平台更改为 macOS(所有新的 playground 默认设置为 iOS)。
CoreText not 原生支持 删除线 排版文本修饰(但支持下划线 就像您在问题中指出的那样)。 CoreText 支持的完整字符串属性列表是 described here.
这个旧的 Objective-C based blog post 提供了使用 CoreText API 手动实现删除线的必要细节。不幸的是,根本不是快速修复。
较高级别的 TextKit 框架 提供删除线支持。要快速查看工作情况,只需替换原始代码中的这一行:
CTLineDraw(line, context)
改为:
attrString.draw(at: .zero)
而且,顺便说一句,这在某种程度上有助于验证您的原始 NSAttributedString
开头没有任何问题 ;)
当然,根据您的代码对 CoreText 的依赖程度,切换到 TextKit 可能是一项非常重要的任务,因此您也需要牢记这一点。