删除线无法在macOS上的CoreText中工作

时间:2019-04-27 09:43:38

标签: swift macos core-text strikethrough

删除线未显示,但下划线显示。代码如下,它相当简单。当我注释掉下划线时,显示的文本没有删除线,当我注释掉删除线并显示下划线时,它可以正常工作。我已经尝试了一切,但我必须丢失一些明显的东西,文档说三脚架应该起作用。

我正在运行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)。

1 个答案:

答案 0 :(得分:1)

CoreText 删除线印刷文本修饰没有天然支持(但支持下划线您在问题中注明)。 CoreText支持的字符串属性的完整列表为described here

这个旧的Objective-C based blog post提供了使用CoreText API手动实现删除线的必要细节。不幸的是,根本不是快速修复。


更高级别的 TextKit 框架确实提供删除线支持。要快速查看其工作原理,只需在原始代码中替换此行:

CTLineDraw(line, context)

与此相反:

attrString.draw(at: .zero)

并且,顺便说一句,这以某种方式有助于验证您最初的NSAttributedString开头是否没有问题;)

当然,取决于代码对CoreText的依赖程度,切换到TextKit可能不是一件容易的事,因此您也需要牢记这一点。