在 iOS 上显示按比例间隔的数字(而不是等宽/表格)

2024-01-01

我在 iOS 中渲染数字(目标为 7 及以上),方法是将它们存储在 NSAttributedString 中并使用“drawAtPoint:”进行渲染。我正在使用 Helvetica Neue。

我注意到这样画出的数字的位数不成比例– 字形都具有相同的宽度。即使是一个细小的“1”也占据了与“0”相同的空间。

测试证实了这一点:

for(NSInteger i=0; i<10; ++i)
{
  NSString *iString = [NSString stringWithFormat: @"%d", i];
  const CGSize iSize = [iString sizeWithAttributes: [self attributes]];
  NSLog(@"Size of %d is %f", i, iSize.width);
}

与,其他地方:

-(NSDictionary *) attributes
{
  static NSDictionary * attributes;
  if(!attributes)
  {
    attributes = @{
                   NSFontAttributeName: [UIFont systemFontOfSize:11],
                   NSForegroundColorAttributeName: [UIColor whiteColor]
                   };
  }
  return attributes;
}

由此产生的字形全部具有相同的宽度6.358 分。

是否有一些渲染选项我可以打开它启用比例数字字形?是否有另一种字体(最好类似于 Helvetica Neue)支持比例数字字形(最好是内置的)?还要别的吗?

谢谢。


iOS 7 允许您使用指定字体UIFontDescriptor实例。 AUIFont然后从描述符中获取实例。

Given a UIFontDescriptor还可以使用以下方法对其进行定制,以更改某些特征[fontDescriptor fontDescriptorByAddingAttributes: attibutes] where attributes is an NSDictionary字体属性。

Apple 文档中的属性UIFontDescriptor参考 https://developer.apple.com/LIBRARY/IOS/documentation/UIKit/Reference/UIFontDescriptor_Class/Reference/Reference.html.

从参考文献中,一个特定的字体描述符属性UIFontDescriptorFeatureSettingsAttribute允许您提供“代表非默认字体功能设置的字典数组。每个字典包含UIFontFeatureTypeIdentifierKey and UIFontFeatureSelectorIdentifierKey."

的文档UIFontFeatureTypeIdentifierKeys and UIFontFeatureSelectorIdentifierKeys is in Apple 的字体注册表文档 https://developer.apple.com/fonts/registry/。本节涵盖了比例数字的具体情况Apple 演示文稿的 pdf 幻灯片 http://docs.huihoo.com/apple/wwdc/2013/session_223__using_fonts_with_text_kit.pdf,所以我就把它举起来了。

该代码将采用现有的UIFont实例并返回一个具有比例数字的新实例:

// You'll need this somewhere at the top of your file to pull
// in the required constants.
#import <CoreText/CoreText.h>

…

UIFont *const existingFont = [UIFont preferredFontForTextStyle: UIFontTextStyleBody];
UIFontDescriptor *const existingDescriptor = [existingFont fontDescriptor];

NSDictionary *const fontAttributes = @{
 // Here comes that array of dictionaries each containing UIFontFeatureTypeIdentifierKey 
 // and UIFontFeatureSelectorIdentifierKey that the reference mentions.
 UIFontDescriptorFeatureSettingsAttribute: @[
     @{
       UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType),
       UIFontFeatureSelectorIdentifierKey: @(kProportionalNumbersSelector)
      }]
 };

UIFontDescriptor *const proportionalDescriptor = [existingDescriptor fontDescriptorByAddingAttributes: fontAttributes];
UIFont *const proportionalFont = [UIFont fontWithDescriptor: proportionalDescriptor size: [existingFont pointSize]];

您可以将其添加为类别UIFont如果你愿意的话等等

编辑说明:感谢 Chris Schwerdt 的改进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 iOS 上显示按比例间隔的数字(而不是等宽/表格) 的相关文章

随机推荐

  • 虚拟下游设备的 Azure IoT Edge 模块身份转换

    我有以下设置 多个 Modbus 传感器 1 通过 ModbusTCP 连接到这些传感器的网关 在此网关上 一个 Azure IoT Edge 模块正在运行 使用 NodeJS SDK 该模块读取每个连接的传感器的所有值 用于设备管理的 A
  • 是否可以在python中的字典末尾添加

    当我引入新的对时 它被插入到字典的开头 可以在最后追加吗 UPDATE 从 Python 3 7 开始 字典记住插入顺序 https stackoverflow com a 39980744 1258041 通过简单地添加一个新值 您可以确
  • Android Chronometer 从定义的值开始

    我有一个应用程序 在其中向用户显示他正在做的事情的计时器 每当活动进入后台 无论是通过主页按钮还是返回 时 我都会保存该时间 以秒为单位 当活动返回时 我想继续从同一时间运行计时器 用户可能会从列表中选择不同的项目 时间也会不同 而且他可能
  • 使用arduinoEDK通过esp8266调用nest api

    我正在尝试使用 ESP8266 和 Arduino EDK 连接到 Nest API 恒温器 但至今还没有结果 我以前见过有人在这里问过同样的问题 但他的问题的答案对我没有帮助 这是我的代码 Code include
  • Java 连接池最佳实践?

    在厌倦了 c3p0 的持续锁定后 我转向 BoneCP 为我的数据库寻找替代连接池 我有一个服务器应用程序 每分钟处理大约 7 000 个项目 并且需要将这些项目记录到我们的 MySQL 数据库中 我目前有 100 个工作线程 并像这样设置
  • 如何从 CI/CD 管道监控 adf 管道

    我有一个 CD 管道 它会触发 azure 数据工厂 adf 管道 但它 CD 管道 不会等到 adf 管道完成才继续执行下一个任务 我想知道 CD 管道中是否有任何内置功能 我可以通过它们触发和监视 adf 管道 因此 我期望的结果是 C
  • 如何在 gettext .po 文件中指定有序变量?

    我有一个多语言站点 它使用 Zend Translate PHP 数组来处理翻译 它工作正常 但我正在尝试转换为使用 gettext 因为它提供了额外的功能 然而 我还没有发现 gettext 相当于我在 PHP 数组翻译中喜欢的功能 n
  • Chart.js v2.6:向饼图输出值添加箭头

    我正在使用 Chart js v2 6 输出饼图 数据是从MySQL数据库中获取的 图表渲染正确 但我需要向数据值添加箭头 如下面的屏幕截图所示 带箭头的饼图示例 下面是我使用 Chart js 输出饼图的代码 var chartdata
  • java 打印一个三角形

    我正在尝试制作一个程序 该程序接受用户输入 例如三角形应该有多长及其方向 我遇到的问题是 在我运行程序后 它不断向程序添加更多数字 例如 State the length of the two sides finish with 1 5 S
  • 将 Microsoft.AspNet.Identity 升级到 rc1 后找不到 IdentityStoreManager

    将 Microsoft AspNet Identity Core 升级到 1 0 0 rc1 后 由 Visual Studio 2013 中的默认 MVC5 模板生成的 AccountController cs 和 AppModel cs
  • HTML5 是一种编程语言吗?

    如今 我们可以使用 HTML5 来制作应用程序 例如在 android firefox 操作系统 iPhone 黑莓等中 但是 我听说HTML是一种标记语言 不是用于编程的 即使有了应用程序功能 HTML 仍然是only标记语言 编程语言具
  • 使用架构组件导航从单个活动传递数据以启动目标片段

    我有以下内容Activity 这是我的应用程序中的唯一一个 MainActivity java public class MainActivity extends AppCompatActivity Override protected v
  • .NET 7/8 如何使用 Minimap API 提供组的描述/摘要?

    我添加了一组最小的 API 如下所示 var myapi app MapGroup myapi WithTags My API WithOpenApi and then myapi MapGet GetAllStuff WithName G
  • Oracle/SQL - 合并来自“不相关”不相关表的计数

    假设我有两张桌子GOOD and BAD存储小部件生产的记录 我的桌子看起来像这样 Widget Good Widget A Y Widget A Y Widget B Y Widget Bad Widget A Y Widget B Y
  • 您是否必须取消订阅组件中的 QueryList?

    当使用 ContentChildren or ViewChildren用于监听 DOM 元素更改的装饰器 我是否必须取消订阅QueryList 例如 Component export class ParentComponent implem
  • 在wpf中动态添加列到DataGrid

    我目前正在处理自定义画布 并且必须添加一个表格 所以我认为 dataGrid 就可以了 所以我想创建一个 Table from 数据网格 用户可以通过它在运行时将表格添加到画布 到目前为止 我已经尝试使用列表填充 DataGrid 并成功了
  • 有效地重新格式化数据布局

    我有几个 Excel 电子表格 其数据布局如下raw data https i stack imgur com QOju9 jpg company company1 company2 company3 currency Y E 1 1 20
  • Java 中的 Byte 和 Short 的要点(我已阅读其他问题)

    我的问题是 如果我从 Java 反汇编中得到它 当我使用 byte a 3 b 5 System out println a b 实际上会使用 int 而不是 byte 此外 所有本地内存插槽都是 4B 就像堆栈插槽一样 我意识到分配一个字
  • 为什么我的角度应用程序在更改支持 mat-tree 的数据后变得非常慢?

    我正在实现角度 材料树组件并遇到一些问题 保存对树的更改后 我正在重置支持树的数据 有效 但是应用程序变得非常慢 扩展节点可能需要大约 8 秒 更奇怪的是 实际操作数据源的代码是在其他地方运行的 例如向树中添加新的子项 我们希望 UI 更新
  • 在 iOS 上显示按比例间隔的数字(而不是等宽/表格)

    我在 iOS 中渲染数字 目标为 7 及以上 方法是将它们存储在 NSAttributedString 中并使用 drawAtPoint 进行渲染 我正在使用 Helvetica Neue 我注意到这样画出的数字的位数不成比例 字形都具有相