50

我正在努力理解点大小的确切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 像素?或者纯粹是从其他东西定义一个点?

4

5 回答 5

13

字体有一个内部坐标系,可以把它想象成一个单位正方形,其中一个字形的矢量坐标被指定为任意大小以适应字体中的所有字形 +- 字体设计者选择的任意数量的边距。

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

因此,在 72 点处绘制“A”告诉您它将是在相同字体中绘制在 36 点处的“A”的两倍 - 绝对没有其他关于实际位图大小的信息。

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

于 2012-08-02T19:55:23.763 回答
6

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

我相信-[UIFont lineHeight]测量高度会更好。

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

typographic points注意构建字体时使用的和points从 iOS使用的区别default logical coordinate space。不幸的是,文档中没有很清楚地解释差异。

于 2012-08-02T12:05:23.610 回答
4

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

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

其次,理论上的文字高度通常与您肉眼实际看到的渲染笔画不同。原始文本高度的想法来自用于打印的实际字形。所有字母都刻在字形块上,它们具有相同的高度——与字体点高度相匹配。但是,根据不同的字母和不同的字体设计,文字的实际可见部分可能会比​​理论高度略短。Helvetica Neue 其实很标准。如果您测量字母“k”的顶部到字母“p”的底部,它将与字体高度匹配。

第三,电脑显示器搞砸了DPI,同时也搞砸了点的定义。计算机显示器的分辨率由它们的原始像素描述,例如 1024 x 768 或 1920 x 1080。软件实际上并不关心显示器的物理尺寸,因为如果它们像在纸上打印一样缩放屏幕内容,一切都会变得非常模糊——只是物理分辨率不够高,无法让一切顺利合法。软件使用一种非常简单且死板的方式:为您使用的任何显示器固定 DPI。对于 Windows,它是 96DPI;对于 Mac,它是 72DPI。也就是说,无论你的显示器上有多少像素一英寸,软件都会忽略它。当操作系统以 72pt 呈现文本时,它在 Windows 上总是 96px 高,在 Mac 上总是 72px 高。(那'

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

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

于 2015-05-14T19:14:33.507 回答
3

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

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

但是,字体包含各种不适合该度量定义的空间的字形。在东欧语言中,字母在升序上方带有变音符号,各种标点符号和特殊字符可以放入更大的“布局框”中。(有关大量示例,请参见 Mac OS X 的特殊字符窗口中的数学符号部分。)

CGSize返回的 by-[NSString sizeWithFont:]中,宽度占了字符串中的具体字符,而高度只反映了行数。行高是字体指定的度量,与包含字体最大字符的“布局框”相关。

于 2012-08-02T21:32:55.047 回答
0

据我所知,事实是UIFont谎言。所有这些UIKit都使用字体。如果你想要你需要使用的真相CoreText,但在很多情况下它会更慢!(因此,对于您的像素高度表,我认为它添加了某种 a + bx 因子,其中 x 是点大小。

那么它为什么要这样做呢?速度!UIKit四舍五入并调整间距,以便它可以缓存位图。或者至少那是我的收获!

于 2012-08-03T08:42:05.133 回答