Приведение NSFont к CGFont - невозможно? - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь привести NSFont к CGFont:

 var defaultFont: NSFont = NSFont.labelFont(ofSize: CGFloat(currentSize))

Как это:

 if let oldFont = defaultFont as? CGFont {...

Нет, компилятор говорит «нет»: Conditional downcast to CoreFoundation type 'CGFont' will always succeed. Хорошо, давайте попробуем другой способ:

 let oldFont = defaultFont as CGFont

Нет. Компилятор говорит «нет»: 'NSFont' is not convertible to 'CGFont'; did you mean to use 'as!' to force downcast?. Хорошо, давайте использовать as!:

 let oldFont = defaultFont as! CGFont

Copmpiler говорит «да» !, но ошибка времени выполнения говорит: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

Я попытался запустить CGFont по имени, но не все мои шрифты «смонтированы в системе», и имя шрифта могло бы измениться с Font-Name на Font_name, если оно инициировано CGFont (_ name: CFString). Это рискованно.

Любая помощь?

1 Ответ

2 голосов
/ 04 июля 2019

С https://lists.apple.com/archives/cocoa-dev/2010/Feb/msg00177.html:

Учитывая объект NSFont, как я могу извлечь или создать из него CGFontRef для использования непосредственно с CoreGraphics?

Ты рядом. Начиная с (я думаю) Leopard, NSFont и CTFontRef (не CGFontRef) являются бесплатными мостовыми соединениями, поэтому вы должны иметь возможность использовать CTFontCopyGraphicsFont (), чтобы получить CGFontRef из NSFont.

Пример:

import CoreText

let defaultFont: NSFont = ...
let cgFont = CTFontCopyGraphicsFont(defaultFont, nil)
...