为什么UIFont和CGFont / CTFont完全分离?

我试图用一个下载的字体画一些文字。 我查看了API文档并search了网页。 我find了一个解决scheme,但问题是,它只适用于CoreGraphics级框架。 所以我search了一种将CGFont转换成CGFont的方式,但是没有办法做到这一点。

我意识到UIFontCGFont/CTFont完全分离,即使它们是从相同的字体文件创build的。 CGFontCTFont可以相互转换,但是对于UIFont ,唯一的方法就是重新创build名称和大小等属性。 而适用的代码也是分开的。

例如, CATextLayer只接受CGFont / CTFont – 没有UIFont 。 但是所有UIKit控件只接受UIFont

为什么这种分离存在? 还是我错了? (在UIKit类中使用下载的字体的任何方式?)

简短的回答: “只有苹果的人知道”

在挖掘(反转)框架之后,更详细的答案是:

  • UIKit.framework完全不使用CGFonttypes
  • UIKit.framework使用,而不是CoreText CTFontGSFont
  • GSFont来自… GraphicsServices私人框架
  • GraphicsServices …使用CGFont

所以这里是我的猜测(可能是完全错误的)

  • UIFont > GSFont (私人) > CGFont
  • UIKit > GraphicsServices > CoreGraphics

    至less就字体而言,苹果工程师通过隐藏的GraphicsServices之一,在UIKitCoreGraphics框架之间build立了一个抽象层。

  • iOS > iOS (专用) > Mac OSX

    为什么他们这样做,我想说来自Mac OSX的CoreGraphics对于iOS设备来说并不是最优的,而UIKit只是iOS,他们在两个apis之间增加了一层。 或者更一般地说,他们计划有一天从CoreGraphics完全分离UIKit …从Mac OSX的iOS …谁知道! 苹果伙计们 ,我简短的回答:)

关于使用UIKit自定义字体,你可能有兴趣阅读这个 。