将CATextLayer字体转换为UIFont

时间:2017-12-21 10:21:14

标签: ios swift cocoa

CATextLayer.font属性是不透明的CFTypeRef。有没有办法将该引用转换为UIFont?我不介意它是否返回一个可选的UIFont。

2 个答案:

答案 0 :(得分:1)

我刚写了以下应该处理的扩展程序:CTFontCGFont,字符串名称或UIFont

extension CATextLayer {
    public var typeFace:UIFont? {
        let name:String
        switch font {
        case let ctFont as CTFont :
            // If you assign a UIFont to CATextLayer.font
            // it is implicitly converted to CTFont,
            // so this case will be called.
            guard let _name = CTFontCopyName(ctFont, kCTFontPostScriptNameKey) else {
                return nil
            }
            name = _name as NSString as String
        case let cgFont as CGFont :
            guard let _name = cgFont.postScriptName else {
                return nil
            }
            name = _name as NSString as String
        case let string as NSString :
            name = string as String
        case let string as String :
            name = string
        default:
            return nil
        }
        return UIFont(name:name, size:fontSize)
    }
}

在旁注中,我发现文档中的评论不准确:

  

在iOS中,您无法将UIFont对象分配给此属性。

根据我的测试,我可以在UIFont上设置CATextLayer.font,但似乎工作正常。

修改

当您将UIFont分配给CATextLayer.font时,它会在幕后转换为CTFont,因此为了让UIFont退出,这是必要的从CTFont转换为UIFont(我的代码所做的)。简单地转换为UIFont是行不通的。

答案 1 :(得分:0)

你可以这样做,

let font : UIFont = layer.font as! UIFont

希望这有帮助