UIFont的点大小究竟是什么?

时间:2012-08-02 11:48:07

标签: objective-c ios fonts uikit uifont

我很难准确理解UIFont中的磅值是什么意思。它不是像素,它似乎不是点的标准定义,它们与1/72英寸相关。

我使用不同大小的-[NSString sizeWithFont:]字体计算了像素大小,并获得了以下内容:

| Point Size | Pixel Size |
| ---------- | ---------- |
| 10.0       | 13.0       |
| 20.0       | 24.0       |
| 30.0       | 36.0       |
| 40.0       | 47.0       |
| 50.0       | 59.0       |
| 72.0       | 84.0       |
| 99.0       | 115.0      |
| 100.0      | 116.0      |

(我做了[@"A" sizeWithFont:[UIFont systemFontOfSize:theSize]]

查看72.0点大小,这不是1英寸,因为这是在DPI为163的设备上,所以1英寸将是163.0像素,对吗?

有人可以用UIFont术语解释什么是“点”吗?即我的方法是错误的,如果我使用别的东西,我会看到有关字体的东西是72点的163像素?或者纯粹是从一个其他东西定义一个点?

5 个答案:

答案 0 :(得分:11)

字体具有内部坐标系,将其视为单位正方形,其中字形的矢量坐标以任意大小指定,适应字体中的所有字形+ - 字体设计者选择的任何边距。< / p>

在72.0点,字体的单位平方是一英寸。字体 y 的字形 x 具有相对于此英寸方格的任意大小。因此,字体设计者可以制作相对于其他字体显得大或小的字体。这是字体“字符”的一部分。

因此,在72点绘制一个'A'会告诉你它会是同一字体中36点绘制的'A'的两倍 - 而且实际的位图大小绝对没有其他内容。< / p>

即对于给定字体,确定点大小和像素之间关系的唯一方法是测量它。

答案 1 :(得分:5)

我不确定-[NSString sizeWithFont:]如何衡量身高。它是使用线高还是贝塞尔峰的差异?你用了什么文字?

我相信-[UIFont lineHeight]会更好地衡量身高。

编辑: 另请注意,没有一种测量方法返回大小(以像素为单位)。它返回points中的大小。您必须将结果乘以[UIScreen mainScreen].scale

请注意构建字体时使用的typographic points与iOS points中的default logical coordinate space之间的差异。不幸的是,文档中没有非常清楚地解释这种差异。

答案 2 :(得分:3)

我首先想知道这是否与[每个“英寸”96的CSS像素定义] [1]的方式有关,而UI布局点定义为每英寸72英寸。 (当然,“英寸”与物理英寸无关。)为什么网络标准会影响到UIKit业务?好吧,您可能会注意到在调试器或崩溃报告中检查堆栈跟踪时,即使您没有使用UIWebView,也会在很多UIKit下面存在一些WebKit代码。实际上,它比这更简单。

首先,字体大小是从常规拉丁文中的最低下行器到最高上升器测量的 - 例如从“j”的底部到“k”的顶部,或者为了便于测量单个字符,“ƒ”的高度。 (这是U + 0192“带有钩子的拉丁文小写字母F”,可以在美国Mac键盘上轻松输入选项-F。人们用它来缩写“文件夹”时的方式。)你会注意到,当用这个方案测量时,以像素为单位的高度(在1x显示器上)与指定的字体大小匹配 - 例如使用[UIFont systemFontOfSize:14],“ƒ”将是14像素高。 (测量大写字母“A”仅占字体大小测量空间的任意部分。此部分可能会以较小的字体大小更改;当将字体向量渲染为像素时,“提示”会修改结果以生成更清晰的屏幕文本。)

但是,字体包含不适合该指标定义的空间的各种字形。东欧语言中有一些带有变音符号的字母,以及适合“布局框”的各种标点符号和特殊字符。 (有关大量示例,请参阅Mac OS X特殊字符窗口中的Math Symbols部分。)

CGSize返回的-[NSString sizeWithFont:]中,宽度会考虑字符串中的特定字符,但高度仅反映行数。行高是字体指定的度量,与包含字体最大字符的“布局框”相关。

答案 3 :(得分:2)

我同意这很令人困惑。我试图在这里给你一些基本的解释,以使事情更清楚。

首先,DPI(每英寸点数)的东西来自印刷,物理纸张。字体也是如此。单位点是为了描述文本的实际打印尺寸而发明的,仅仅是因为英寸对于通常的文本大小来说太大了。然后人们发明了点,即1/72英寸的长度(实际上是在历史上演变而来),很容易描述文本大小。所以,是的,如果您正在使用Word或其他文字处理软件编写文档进行打印,如果使用72pt字体,您将获得绝对一英寸高的文本。

其次,理论文本高度通常与您实际可以通过眼睛看到的渲染笔划不同。原始文本高度的想法来自用于打印的实际字形。所有字母都刻在字形块上,它们具有相同的高度 - 与字体点高度相匹配。但是,根据不同的字母和不同的字体设计,文本的实际可见部分可能比理论高度略短。 Helvetica Neue实际上非常标准。如果你衡量一个字母的顶部&#34; k&#34;在字母&#34; p&#34;的底部,它将匹配字体高度。

第三,计算机显示屏搞砸了DPI,以及同时定义点。计算机显示器的分辨率由其原生像素描述,例如1024 x 768或1920 x 1080.软件实际上并不关心显示器的物理尺寸,因为如果它们缩放屏幕内容(如打印),一切都会非常模糊在纸面上 - 只是物理分辨率不够高,不足以使一切顺利和合法。软件使用一种非常简单且死机的方式:修复了您使用的任何监视器的DPI。对于Windows,它是96DPI;对于Mac来说,它是72DPI。他们说,无论你的显示器上有多少像素,软件都会忽略它。当操作系统在72pt中呈现文本时,它在Windows上总是高96px,在Mac上高出72px。 (这就是为什么Microsoft Word文档在Mac上总是看起来更小,你通常需要缩放到125%。)

最后在iOS上,它非常相似,无论是iPhone,iPod touch,iPad还是Apple Watch,iOS都使用固定的72DPI用于非视网膜屏幕,144DPI用于@ 2x视网膜显示,用于iPhone 6 Plus的@ 3x视网膜显示器和216DPI。

忘掉真正的英寸。它仅存在于实际打印中,不存在于显示中。对于在屏幕上显示文本的软件,它只是与物理像素的人为比率。

答案 4 :(得分:0)

就我所能确定的而言,事实是UIFont谎言。所有UIKit都采用字体自由。如果你想要真相,你需要使用CoreText,但在很多情况下它会更慢! (所以在像素高度表的情况下,我认为它增加了某种+ bx因子,其中x是点大小。

那么为什么会这样呢?速度! UIKit用空格对东西和小提琴进行舍入,以便它可以缓存位图。或者至少那是我带走的!