使用符号特征从* light *字体创建斜体版本

问题描述 投票:0回答:1

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

使用fontDescriptor给我“常规”“ Helvetica Neue”的斜体版本,而不是“ HelveticaNeue-Light”的斜体。我可以检索fontDescriptor.fontAttributes并更新UIFontDescriptor.AttributeName.name,但这很棘手,因为每种字体的命名是不同的(“ HelveticaNeue”使用“斜体”,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个回答
0
投票

这不是最漂亮的,但是它是实用的。它处理所有内置的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)
© www.soinside.com 2019 - 2024. All rights reserved.