【问题标题】:Creating an italic version from a *light* font using symbolic traits使用符号特征从 *light* 字体创建斜体版本
【发布时间】:2020-08-19 04:33:57
【问题描述】:

我想要一个浅色字体的斜体版本,例如“HelveticaNeue-Light”。

使用fontDescriptor 给了我“常规”“Helvetica Neue”的斜体版本,而不是斜体“HelveticaNeue-Light”。我可以检索fontDescriptor.fontAttributes 并更新UIFontDescriptor.AttributeName.name,但这很棘手,因为每种字体的命名不同(“HelveticaNeue”使用“Italic”,Helvetica 使用“Oblique”)。

let lightFont = UIFont(name: "HelveticaNeue-Light", size: 16.0)!
var lightFontDescriptor = lightFont.fontDescriptor.withSymbolicTraits([.traitItalic])!
var lightFontWithItalicTraits = UIFont(descriptor: lightFontDescriptor, size: 0)

// <UICTFont: ..> font-family: "HelveticaNeue-Light"; font-weight: normal; font-style: normal; font-size: 16.00pt
print(lightFont)

// <UICTFont: ..> font-family: "Helvetica Neue"; font-weight: normal; font-style: italic; font-size: 16.00pt
print(lightFontWithItalicTraits)

// The font I expect:
let lightItalicFont = UIFont(name: "HelveticaNeue-LightItalic", size: 16.0)!
// <UICTFont: ..> font-family: "HelveticaNeue-LightItalic"; font-weight: normal; font-style: italic; font-size: 16.00pt
print(lightItalicFont)

任何其他想法如何获得现有字体的斜体版本?

【问题讨论】:

    标签: swift uifont uifontdescriptor


    【解决方案1】:

    它不是最漂亮的,但它很实用。它处理所有内置的 iOS 字体。

    扩展名:

    extension UIFont {
        func italic() -> UIFont? {
            if let italic = UIFont.init(name: "\(self.fontName)-Italic", size: self.pointSize) {
                return italic
            } else if let italic = UIFont.init(name: "\(self.fontName)Italic", size: self.pointSize) {
                return italic
            }
            if let oblique = UIFont.init(name: "\(self.fontName)-Oblique", size: self.pointSize) {
                return oblique
            } else if let oblique = UIFont.init(name: "\(self.fontName)Oblique", size: self.pointSize) {
                return oblique
            }
            var suffixFontName = self.fontName // for font names that have a 2 letter suffix such as ArialMT
            suffixFontName.removeLast(2)
            let suffix = self.fontName.suffix(2)
            if let suffixFontName = UIFont.init(name: "\(suffixFontName)-Italic\(suffix)", size: self.pointSize) {
                return suffixFontName
            }
            if let suffixFontName = UIFont.init(name: "\(suffixFontName)Italic\(suffix)", size: self.pointSize) {
                return suffixFontName
            }
            // no italic, oblique, or mt italic font found
            return nil
        }
    }
    

    用法:

        let helveticaNeueLightItalic = UIFont(name: "HelveticaNeue-Light", size: 16.0)!.italic()
        print(helveticaNeueLightItalic)
    
        let helveticaItalic = UIFont(name: "Helvetica", size: 16.0)!.italic()
        print(helveticaItalic)
    
        let helveticaLightItalic = UIFont(name: "Helvetica-Light", size: 16.0)!.italic()
        print(helveticaLightItalic)
    
        let arialMtItalic = UIFont(name: "ArialMT", size: 16.0)!.italic()
        print(arialMtItalic)
    
        let arialMtBoldItalic = UIFont(name: "Arial-BoldMT", size: 16.0)!.italic()
        print(arialMtBoldItalic)
    

    【讨论】:

    • 谢谢,我希望有办法让UIFontDescriptor 完成这项肮脏的工作。但你是对的,这可以完成工作,并且通过一些单元测试,它可以面向未来。
    • 真的!乐于助人:-)
    • suffixFontName 并不是真正的后缀,而是没有后缀的名称,后缀即foundry,或者也可以是前缀(LT, MT, A, BT, FB, URW)而不仅仅是2个字母。
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2015-04-18
    • 2021-04-06
    相关资源
    最近更新 更多