如何在Swift中将系统字体设置为“黑体斜体”?

5

我正在尝试添加一种系统字体,它的重量是“Heavy”(不是粗体),并且还尝试使其变成斜体。我看到了其他stackoverflow的解决方案,但似乎没有起作用。这是我的做法:

let percentageLabel: UILabel = {
       let label = UILabel()
        label.text = "0"
        label.textAlignment = .center
        label.textColor = .white
        label.font = UIFont.systemFont(ofSize: 32, weight: .heavy, traits: .traitItalic)
       return label
    }()

根据Stack Overflow上的一篇帖子所建议的扩展

extension UIFont {

    static func systemFont(ofSize: CGFloat, weight: UIFont.Weight, traits: UIFontDescriptor.SymbolicTraits) -> UIFont? {
         let font = UIFont.systemFont(ofSize: ofSize, weight: weight)

         if let descriptor = font.fontDescriptor.withSymbolicTraits(traits) {
             return UIFont(descriptor: descriptor, size: ofSize)
         }

         return nil
     }
}

问题在于当我尝试了所有建议的解决方案后,加粗和斜体效果可以实现,但黑体和斜体效果无法实现。它仍然被呈现为普通斜体。

3个回答

8

Swift 5.*

extension UIFont {
      
    class func italicSystemFont(ofSize size: CGFloat, weight: UIFont.Weight = .regular)-> UIFont {
        let font = UIFont.systemFont(ofSize: size, weight: weight)
        switch weight {
        case .ultraLight, .light, .thin, .regular:
            return font.withTraits(.traitItalic, ofSize: size)
        case .medium, .semibold, .bold, .heavy, .black:
            return font.withTraits(.traitBold, .traitItalic, ofSize: size)
        default:
            return UIFont.italicSystemFont(ofSize: size)
        }
     }
    
     func withTraits(_ traits: UIFontDescriptor.SymbolicTraits..., ofSize size: CGFloat) -> UIFont {
        let descriptor = self.fontDescriptor
            .withSymbolicTraits(UIFontDescriptor.SymbolicTraits(traits))
        return UIFont(descriptor: descriptor!, size: size)
     }
      
}

使用方法:

myLabel.font = UIFont.italicSystemFont(ofSize: 34, weight: .black)

1
对我来说非常有效。 - peetadelic

1

试试这个

     label.font = UIFont.systemFont(ofSize: 32, weight: .black, traits: .traitItalic)
//If you just want Italic then use this
   labelInfo.font = UIFont.italicSystemFont(ofSize: 32)

1
Swift 5.0
extension UIFont {
    static func systemFontItalic(size fontSize: CGFloat = 17.0, fontWeight: UIFont.Weight = .regular) -> UIFont {
        let font = UIFont.systemFont(ofSize: fontSize, weight: fontWeight)
        return UIFont(descriptor: font.fontDescriptor.withSymbolicTraits(.traitItalic)!, size: fontSize)
    }
}

使用方法:

label.font = UIFont.systemFontItalic(size: 20.0, fontWeight: .black)

输出:

enter image description here


2
嗨,我尝试了这个但仍然不起作用。你觉得这是模拟器的问题吗? - Archid
尝试过了,您的扩展程序忽略了字体粗细。 - David Villegas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接