将CATextLayer字体转换为UIFont

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将CATextLayer字体转换为UIFont相关的知识,希望对你有一定的参考价值。

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

答案

我刚写了以下应该处理的扩展:CTFontCGFont,string name或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是行不通的。

另一答案

你可以这样做,

let font : UIFont = layer.font as! UIFont

希望这可以帮助

以上是关于将CATextLayer字体转换为UIFont的主要内容,如果未能解决你的问题,请参考以下文章

如何从常规UIFont创建粗体UIFont?

解决CATextLayer在越狱设备上字体颜色问题。

UIFont - 如何获取系统细字体

UIFont 字体样式 [UIFont fontWithName~];

UIFont fontWithName 字体名称

如何获取 UIFont 实例的字体大小或粗体版本