在 iOS 11 中引入了 UIFontMetrics
类。我做了一些实验,但我不明白如何 scaledFont(for:)方法计算返回字体的字体大小。例如,苹果 says Large(默认) 动态字体大小,body 样式大小为 17(点),对于 AX5(最大)动态类型大小,body 样式大小为 53。因此,在类型大小为 AX5 的设备中,当我调用
UIFont.preferredFont(forTextStyle: .body)
我正确地获得了 53 的字体大小。如果我打电话
UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 17))
我期望相同的字体大小为 53,但我得到的字体大小为 48。
为什么? scaledFont(for:)如何方法计算返回字体的字体大小?
==== 编辑 ===
我尝试以Large 和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
最佳答案
关于他的示例的不合逻辑结果,我得到了与@Giorgio 相同的结论。
我对这个主题进行了研究和多次测试,得出的结论是 scaledFont(for:)
方法:
- 可能被视为一个黑匣子,其中包含一个私有(private)算法以获得适当的大小,其背后的基本原理并不清楚……对我来说。
- 不会像系统字体一样缩放自定义字体,但足够接近以使用其引用表作为指南。
- 必须仅与自定义字体一起使用否则如果系统字体为传入参数,结果可能与Apple网站中定义的不同。
任何时候你需要系统字体,使用preferredFont(forTextStyle:)
方法来确定文本大小的结果否则scaledFont(for:)
是你最好的 friend 。
除非对于 .large
Dynamic Type 大小可以准确定义可能的自定义字体,否则此方法没有点大小精度结果。
一旦内容大小类别发生变化,只能使用 scaledFont(for:)
方法预测自定义字体的近似值。
为了避免特定动态类型大小的文本样式之间可能发生的冲突(例如,标题大小可能会变得比标题大),最好的方法是定义.large
字体大小与 Apple 系统字体相差不远...或 compare graphically every text style .
关于ios - UIFontMetrics : scaled font size calculation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51243804/