ios - UIFontMetrics : scaled font size calculation

标签 ios swift accessibility uifont dynamic-type-feature

在 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:)如何方法计算返回字体的字体大小?

==== 编辑 ===

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

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/

相关文章:

iOS Facebook 登录崩溃

ios - 包含某些字符的字符串导致 UITextView 过早换行

ios - 弹出 View 时,完成处理程序会发生什么?

android - 如何在 android 中以编程方式打开/关闭辅助功能设置中的所有声音?

html - 如何仅在安装后从 url 打开 Facebook 应用程序

ios - xcode 7.2 无法构建 Objective-C 模块

html - 空表格单元格的可访问性

twitter-bootstrap - 为什么 Bootstrap 选项卡具有角色 ="presentation"?

ios - 设置 CMSampleBuffer 样本附件(Swift)

ios - 使用 swift 格式化 double 型字符串