首页 > 解决方案 > UIFontMetrics:缩放字体大小计算

问题描述

在 iOS 11UIFontMetrics中引入了类。我做了一些实验,但我不明白scaledFont(for:)方法如何计算返回字体的字体大小。例如,Apple表示对于大型(默认)动态字体大小,主体样式大小为17(磅),对于AX5(最大)动态字体大小,主体样式大小为53。因此,在以AX5作为类型大小的设备中,当我调用

UIFont.preferredFont(forTextStyle: .body)

我正确地获得了53的字体大小。如果我打电话

UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 17))

我期望相同的字体大小为53,但我获得的字体大小为48

为什么?scaledFont(for:)方法如何计算返回字体的字体大小?

==== 编辑 ===

我尝试以大号AX5动态字体大小打印这两种字体。这些是结果:

大的

let font = UIFont.preferredFont(forTextStyle: .body)
let font1 = UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 17))
print(font)   
print(font1)

// Output
// <UICTFont: 0x7fd36a414b80> font-family: ".SFUIText"; font-weight: normal; font-style: normal; font-size: 17.00pt
// <UICTFont: 0x7fd36a416360> font-family: ".SFUIText"; font-weight: normal; font-style: normal; font-size: 17.00pt

AX5

let font = UIFont.preferredFont(forTextStyle: .body)
let font1 = UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 17))
print(font)
print(font1) 

// Output
// <UICTFont: 0x7f8addf1baa0> font-family: ".SFUIDisplay"; font-weight: normal; font-style: normal; font-size: 53.00pt
// <UICTFont: 0x7f8addf1eba0> font-family: ".SFUIDisplay"; font-weight: normal; font-style: normal; font-size: 48.00pt

标签: iosswiftaccessibilityuifontdynamic-type-feature

解决方案


关于他的例子不合逻辑的结果,我得到了与@Giorgio 相同的结论。

我对此主题进行了研究和许多测试,得出的结论是该scaledFont(for:)方法:

  • 可能被视为一个黑匣子,其中包含一个私有算法以获得适当的大小,其背后的原理尚不清楚......对我来说。
  • 不会像系统字体一样缩放自定义字体,但足够接近以使用其参考表作为指南。
  • 必须仅与自定义字体一起使用,否则如果系统字体是传入参数,结果可能与 Apple 网站中定义的不同。

每当您需要系统字体时,请使用该preferredFont(forTextStyle:)方法确保文本大小的结果,否则scaledFont(for:)是您最好的朋友。

.large除非可以准确定义可能的自定义字体的动态类型大小,否则此方法没有磅值精度结果。

一旦内容大小类别发生变化,使用该方法只能预测自定义字体的近似值scaledFont(for:)

为避免特定动态类型大小的文本样式之间可能发生冲突(例如,标题大小可能比标题大),最好的方法是定义与.largeApple 系统字体不太远的字体大小......或以图形方式进行比较每个文本样式


推荐阅读