ios - 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
解决方案
关于他的例子不合逻辑的结果,我得到了与@Giorgio 相同的结论。
我对此主题进行了研究和许多测试,得出的结论是该scaledFont(for:)
方法:
- 可能被视为一个黑匣子,其中包含一个私有算法以获得适当的大小,其背后的原理尚不清楚......对我来说。
- 不会像系统字体一样缩放自定义字体,但足够接近以使用其参考表作为指南。
- 必须仅与自定义字体一起使用,否则如果系统字体是传入参数,结果可能与 Apple 网站中定义的不同。
每当您需要系统字体时,请使用该preferredFont(forTextStyle:)
方法确保文本大小的结果,否则scaledFont(for:)
是您最好的朋友。
.large
除非可以准确定义可能的自定义字体的动态类型大小,否则此方法没有磅值精度结果。
一旦内容大小类别发生变化,使用该方法只能预测自定义字体的近似值scaledFont(for:)
。
为避免特定动态类型大小的文本样式之间可能发生冲突(例如,标题大小可能比标题大),最好的方法是定义与.large
Apple 系统字体不太远的字体大小......或以图形方式进行比较每个文本样式。
推荐阅读
- java - 如何用 mockito 模拟静态方法?
- oracle - 如何在 Oracle 中克隆可插拔数据库
- typescript - 如何使用打字稿在 vuejs 中的数据中添加“文件”类型?
- php - 使用错误表别名生成查询的学说 - Symfony 5
- redis - 如何通过ps命令获取redis的配置文件路径
- python - 如何在 Jupyter Notebook 中通过 WordCloud 将文本放入图像中
- html - 如何在底部设置此导航栏?
- macos - 在 macOS 上,如何从终端打开一个新的 Chrome 窗口而不是一个新的选项卡(即 Bash 命令)
- r - 如何在 R 的“htest”对象中设置备择假设文本字符串?
- javascript - 有没有办法通过下拉菜单在下一个输入的文本上即时更改文本样式?