Почему UIFont и CGFont/CTFont полностью разделены?

Я пытался нарисовать текст с загруженным шрифтом. Я просмотрел документацию по API и обыскал в Интернете. Я нашел решение, но проблема в том, что он применим только к структуре уровня CoreGraphics. Поэтому я искал способ конвертировать CGFont в UIFont, но не было никакого способа сделать это.

Я понял, что UIFont и CGFont/CTFont полностью разделены, хотя они созданы из того же файла шрифта. CGFont и CTFont являются конвертируемыми от/друг к другу, но для UIFont единственный способ - воссоздать с его атрибутами, такими как имя и размер. И соответствующие коды также разделяются.

Например, CATextLayer принимает только CGFont/CTFont - no UIFont. Но все элементы управления UIKit принимают только UIFont.

Почему существует такое разделение? Или я ошибаюсь? (Любой способ использования загруженного шрифта в классах UIKit?)

Ответы

Ответ 1

Короткий ответ: "Только люди Apple знают"

Более подробный ответ, после копания (реверсирование) фреймворков:

  • UIKit.framework не использует вообще CGFont type
  • UIKit.framework используйте вместо CoreText CTFont и GSFont...
  • GSFont происходит из... GraphicsServices private framework
  • GraphicsServices... использовать CGFont

Итак, вот моя догадка (может быть, совсем не так):

  • UIFont > GSFont (частный) > CGFont
  • UIKit > GraphicsServices > CoreGraphics:

    По крайней мере, в отношении шрифтов инженеры Apple установили уровень абстракции между UIKitи CoreGraphics, через obscur GraphicsServices one.

  • iOS > iOS (частный) > Mac OSX:

    Почему они это сделали, я бы сказал, что CoreGraphics, который поставляется с Mac OSX, не был оптимальным для устройств iOS, а UIKit был только iOS, они добавили слой между обоими apis. Или, как правило, они планируют один день полностью отделить UIKit от CoreGraphics... iOS от Mac OSX... Кто знает! Яблочные люди, мой короткий ответ:)

Об использовании пользовательских шрифтов с UIKit вам может быть интересно прочитать this.