Зачеркивание не работает в CoreText на macOS - PullRequest
1 голос
/ 27 апреля 2019

Зачеркивание не отображается, но подчеркивание отображается.Код, как показано ниже, довольно прост.Когда я закомментирую подчеркивание, текст отображается без зачеркивания, когда я закомментирую зачеркивание и показываю подчеркивание, он работает нормально.Я перепробовал все - я, должно быть, упускаю что-то очевидное, в документах говорится, что вычеркивание должно работать.

Я использую 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 в настройках инспектора (все новые игровые площадки установлены на iOS по умолчанию).

1 Ответ

1 голос
/ 28 апреля 2019

CoreText не не имеет встроенную поддержку зачеркивания типографского оформления текста (но поддерживает подчеркивания просто отлично, как вы отметили в своемвопрос).Полный список строковых атрибутов, поддерживаемых CoreText, описан здесь . .

. Это старое, сообщение в блоге, основанное на Objective-C , предоставляет необходимую информацию для реализации зачеркивания вручную с использованием CoreText.API-интерфейсы.К сожалению, это не быстрое решение.


Более высокий уровень TextKit framework обеспечивает поддержку зачеркивания.Чтобы быстро увидеть, что работает, просто замените эту строку в исходном коде:

CTLineDraw(line, context)

на это вместо:

attrString.draw(at: .zero)

И, кстати, это как-то помогает подтвердить, что ничего не былонеправильно с вашим исходным NSAttributedString для начала;)

Конечно, в зависимости от того, насколько ваш код полагается на CoreText, переключение на TextKit может быть нетривиальной задачей, поэтому вам нужно держать это вум тоже.

...