在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
答案 0 :(得分:1)
关于他的例子的不合逻辑的结果,我得到了与@Giorgio相同的结论。
我对此主题进行了研究和测试,得出scaledFont(for:)
方法的结论:
每当您需要系统字体时,请使用preferredFont(forTextStyle:)
方法以确保文本大小的结果,否则scaledFont(for:)
是您最好的朋友。
这种方法没有磅数精度结果,除非可以精确定义可能的自定义字体的.large
动态字体大小。
一旦内容大小类别更改,使用scaledFont(for:)
方法只能预测自定义字体的近似值。
为避免在特定的动态字体大小(例如,标题大小可能变得大于标题)时,文本样式之间可能发生冲突,最好的方法是定义.large
字体大小距离Apple系统字体的...或compare graphically every text style不太远。
答案 1 :(得分:0)
由于它们是不同的字体,并且默认系统字体的pointSize 48与主体字体的pointSize 53相同。
Pointsize!=实际渲染的大小。
(但我只是在猜测,您需要将它们并排进行比较)。