首页 > 解决方案 > 如何创建斜体和黑色(粗细)UIFont 对象?

问题描述

我想创建一个既是黑色(比粗体重)又是斜体的 UIFont,而不用硬编码任何字体名称或任何东西。

我所有的尝试都失败了。您可以通过 UIFont.systemFont(ofSize: 15.0, weight: .black) 然后应用斜体符号特征来做到这一点,但这显然只适用于系统字体。(例如,Helvetica 和 Avenir 都有不同的字体粗细,包括斜体变体。)

这是我的尝试,但它只提供了一种常规粗细斜体字体,而不是黑色。

var fontAttributes: [UIFontDescriptor.AttributeName: Any] = [:]
var fontTraits: [UIFontDescriptor.TraitKey: Any] = [:]
fontTraits[.weight] = UIFont.Weight.black // Also hardcoding a number like 0.6 does not work

fontAttributes[.traits] = fontTraits

let descriptor1 = UIFontDescriptor(fontAttributes: fontAttributes)
let descriptor2 = descriptor1.withSymbolicTraits(.traitItalic)!

let font = UIFont(descriptor: descriptor2, size: 19.0)

label.font = font // Sad trombone music. It's just 'regular italic'.

标签: ioscocoa-touchuikituifont

解决方案



我尝试了一些不同的路线,但这看起来很有希望。看起来字体名称是必不可少的。它似乎还从现有字体中找到了“最佳”匹配。

改编自https://github.com/wireapp/wire-ios/blob/develop/Wire-iOS/Sources/Helpers/UIFont%2BWeight.swift

import UIKit

public extension UIFont {

    /// Returns a font object that is the same as the receiver but which has the specified weight and symbolic traits
    func with(weight: Weight, symbolicTraits: UIFontDescriptor.SymbolicTraits) -> UIFont {

        var mergedsymbolicTraits = fontDescriptor.symbolicTraits
        mergedsymbolicTraits.formUnion(symbolicTraits)

        var traits = fontDescriptor.fontAttributes[.traits] as? [String: Any] ?? [:]
        traits[kCTFontWeightTrait as String] = weight
        traits[kCTFontSymbolicTrait as String] = mergedsymbolicTraits.rawValue

        var fontAttributes: [UIFontDescriptor.AttributeName: Any] = [:]
        fontAttributes[.family] = familyName
        fontAttributes[.traits] = traits

        return UIFont(descriptor: UIFontDescriptor(fontAttributes: fontAttributes), size: pointSize)
    }
}

推荐阅读