【问题标题】:How to cast a UIFont object to CTFont in Swift如何在 Swift 中将 UIFont 对象转换为 CTFont
【发布时间】:2014-08-18 20:40:09
【问题描述】:

我正在尝试将一些代码移植到使用 UIFontCTFont 的 Swift 中,并且(在 Objective-C 中成功)使用简单的桥接转换从一个转换到另一个转换,反之亦然。

例如,考虑以下代码(在 UIFontDescriptor 类别中):

UIFont *font = [UIFont fontWithDescriptor:self size:0.0];
NSArray *features = CFBridgingRelease(CTFontCopyFeatures((__bridge CTFontRef)font));

我还没有弄清楚如何在 Swift 中以一种可以实际编译的方式表达这一点。以下至少不会:

let font = UIFont(descriptor:self, size: 0.0)
let features = CTFontCopyFeatures(font as CTFont)

错误:“UIFont”不能转换为“CTFont”

【问题讨论】:

  • 好吧,我不知道这是否可行,但您可以尝试将UIFont初始化为AnyObject,然后将其转换为CTFont。我认为至少转换应该工作,因为每个类都继承自 AnyObject。

标签: uikit swift core-text


【解决方案1】:

试试这个。您不能只是将值从一种类型强制转换为另一种类型。但是,如果您从描述符和大小创建 CTFont,即使您不包含用于转换的矩阵(nil 参数),它似乎也会为您提供一个有效的数组(nil 参数)

let font = CTFontCreateWithFontDescriptor(descriptor, 0.0, nil)
let features: NSArray = CTFontCopyFeatures(font)

至于创建 CTFontDescriptor,我会使用 CTFontDescriptorCreateWithNameAndSizeCTFontDescriptorCreateWithAttributes,具体取决于您最初获得的内容。后者采用简单的 NSDictionary,而前者只使用字体名称和大小。

要使用现有字体(称为originalFont),只需执行以下操作以获取描述符:

let font = CTFontCreateWithName(originalFont.fontName as CFStringRef, 
    originalFont.pointSize as CGFloat, nil)

【讨论】:

  • 虽然这肯定可行,但我真的在寻找一种方法,从现有的 UIFont 实例转到 CTFont 而不从头开始重新创建它。根据docs 的说法,考虑到“它的引用类型 CTFontRef 与 iOS 中的 UIFont 和 OS X 中的 NSFont 是免费桥接的”,这应该是可能的
  • 这仍在创建一个新的字体对象,只是使用原始字体中的数据。我认为应该有可能在 Swift 中实现与 Objective-C 免费桥接转换的等效。也许核心文本 API 还没有被注释/现代化以允许这样做。
  • @dylan gattey :我建议将originalFont.pointSize 的转换从CFStringRef 更改为CGFloat,因为它当前转换不正确。
【解决方案2】:

这显然已在更高版本的 Swift 和/或 CoreText 中得到修复。至少它现在在我使用 Xcode 7.0.1 的测试中有效。

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 2012-03-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2017-05-12
    相关资源
    最近更新 更多