默认 UIFont 大小和重量,但也支持 preferredFontForTextStyle

Posted

技术标签:

【中文标题】默认 UIFont 大小和重量,但也支持 preferredFontForTextStyle【英文标题】:Default UIFont size and weight but also support preferredFontForTextStyle 【发布时间】:2018-11-17 23:25:49 【问题描述】:

如果我有自己的一组UIFonts,大小和重量不同,例如:

let customFont03 = UIFont.systemFont(ofSize: 40, weight: .thin)

如何在支持Dynamic Type 的同时仍保留我的自定义尺寸和重量作为默认标准并根据用户选择无障碍尺寸的方式进行缩放?

我不确定preferredFont(forTextStyle:) 是我想要的,因为它只接受UIFont.TextStyle,我不想将customFont03 锁定为.body.headline 等...

【问题讨论】:

您希望保留首选字体的哪些特征以及您想用自己的设置覆盖哪些特征? 我希望 size 40 和 weight thin 成为默认值,但如果用户将设置更改为默认值以外的任何值,则权重和大小将适当缩放。 【参考方案1】:

动态系统字体,指定样式、粗细和斜体

在 Swift 5 中。

我不敢相信 Apple 没有提供一种更简洁的方法来获得具有特定权重的动态字体。这是我的综合解决方案,希望对您有所帮助!

extension UIFont 
    
    static func preferredFont(for style: TextStyle, weight: Weight, italic: Bool = false) -> UIFont 

        // Get the style's default pointSize
        let traits = UITraitCollection(preferredContentSizeCategory: .large)
        let desc = UIFontDescriptor.preferredFontDescriptor(withTextStyle: style, compatibleWith: traits)

        // Get the font at the default size and preferred weight
        var font = UIFont.systemFont(ofSize: desc.pointSize, weight: weight)
        if italic == true 
            font = font.with([.traitItalic])
        

        // Setup the font to be auto-scalable
        let metrics = UIFontMetrics(forTextStyle: style)
        return metrics.scaledFont(for: font)
    
    
    private func with(_ traits: UIFontDescriptor.SymbolicTraits...) -> UIFont 
        guard let descriptor = fontDescriptor.withSymbolicTraits(UIFontDescriptor.SymbolicTraits(traits).union(fontDescriptor.symbolicTraits)) else 
            return self
        
        return UIFont(descriptor: descriptor, size: 0)
    

你可以这样使用它:

 UIFont.preferredFont(for: .largeTitle, weight: .regular)
 UIFont.preferredFont(for: .headline, weight: .semibold, italic: true)

【讨论】:

【参考方案2】:

UIFontMetrics 是为解决这个问题而设计的类。特别是-[UIFontMetrics scaledFontForFont:] 会按照您的要求进行操作,但请务必查看该类的其他成员,它们可以执行诸如限制字体最大增加之类的事情(在最大的内容大小类别中,大小为 40 的字体将是确实缩放到非常大的尺寸)。

https://developer.apple.com/documentation/uikit/uifontmetrics/2877385-scaledfontforfont

【讨论】:

以上是关于默认 UIFont 大小和重量,但也支持 preferredFontForTextStyle的主要内容,如果未能解决你的问题,请参考以下文章

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

UIFont 可能的大小

动画 UIFont 大小的变化

UIFont 的磅值到底是多少?

-systemFontOfSize:和-boldSystemFontOfSize之间是否有中等重量字体:?

设置允许不同大小的应用程序范围的默认字体