默认 UIFont 大小和重量,但也支持 preferredFontForTextStyle
Posted
技术标签:
【中文标题】默认 UIFont 大小和重量,但也支持 preferredFontForTextStyle【英文标题】:Default UIFont size and weight but also support preferredFontForTextStyle 【发布时间】:2018-11-17 23:25:49 【问题描述】:如果我有自己的一组UIFont
s,大小和重量不同,例如:
let customFont03 = UIFont.systemFont(ofSize: 40, weight: .thin)
如何在支持Dynamic Type
的同时仍保留我的自定义尺寸和重量作为默认标准并根据用户选择无障碍尺寸的方式进行缩放?
我不确定preferredFont(forTextStyle:)
是我想要的,因为它只接受UIFont.TextStyle
,我不想将customFont03
锁定为.body
或.headline
等...
【问题讨论】:
您希望保留首选字体的哪些特征以及您想用自己的设置覆盖哪些特征? 我希望 size40
和 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的主要内容,如果未能解决你的问题,请参考以下文章