UIFontMetrics:缩放的字体大小计算

时间:2018-07-09 10:50:31

标签: ios swift accessibility uifont

在iOS 11 UIFontMetrics类中引入了。我做了一些实验,但是我不明白scaledFont(for:)方法是如何计算返回字体的字体大小的。例如,Apple says对于大(默认)动态类型大小, body 样式大小为 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

2 个答案:

答案 0 :(得分:1)

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

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

  • 可以看作是一个黑匣子,其中包含用于获得适当大小的私有算法,其背后的原理尚不明确...
  • 不能完全像系统字体一样缩放自定义字体,但是距离更近,可以使用其参考表作为指导。
  • 只能与自定义字体一起使用,否则,如果系统字体是传入参数,则结果可能与Apple网站中定义的结果不同。

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

这种方法没有磅数精度结果,除非可以精确定义可能的自定义字体的.large动态字体大小。

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

为避免在特定的动态字体大小(例如,标题大小可能变得大于标题)时,文本样式之间可能发生冲突,最好的方法是定义.large字体大小距离Apple系统字体的...或compare graphically every text style不太远。

答案 1 :(得分:0)

由于它们是不同的字体,并且默认系统字体的pointSize 48与主体字体的pointSize 53相同。

Pointsize!=实际渲染的大小。

(但我只是在猜测,您需要将它们并排进行比较)。