UIFont 的磅值到底是多少?
Posted
技术标签:
【中文标题】UIFont 的磅值到底是多少?【英文标题】:What exactly is UIFont's point size? 【发布时间】:2012-07-31 09:12:00 【问题描述】:我很难准确理解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 像素?还是纯粹是从其他东西定义一个点?
【问题讨论】:
你检查过了吗:***.com/questions/1059101/font-size-in-pixels ? 是的,如果你读到了,你就会明白为什么我期望上表中 72 的值是 163 像素。但它没有,它方式关闭。 我不同意你的论点;仅仅因为您使用 72 号字体测量字母“A”的大小(以像素为单位)只是表明它将占用大约半英寸。您似乎认为字母“A”应该占据一英寸的屏幕。sizeWithFont:
的高度(以像素为单位)包括上升和下降,所以它是整个行高(以像素为单位)。此外,我的问题仍然存在 - 点大小与现实世界之间的关系是什么。再次注意,点和像素大小似乎没有任何意义。
严重 ...***.com/a/38315462/294884
【参考方案1】:
字体有一个内部坐标系,可以把它想象成一个单位正方形,其中一个字形的矢量坐标被指定为任意大小以适应字体中的所有字形 +- 字体设计者选择的任意数量的边距。
在 72.0 点处,字体的单位正方形是一英寸。字体 y 的字形 x 相对于这个平方英寸具有任意大小。因此,字体设计者可以使字体相对于其他字体显得大或小。这是字体“字符”的一部分。
因此,在 72 点处绘制“A”告诉您它将是在相同字体中绘制在 36 点处的“A”的两倍 - 绝对没有其他关于实际位图大小的信息。
ie 对于给定的字体,确定点大小和像素之间关系的唯一方法是测量它。
【讨论】:
所有很好的解释,但不是我所看到的。请注意,点大小加倍不会使像素大小加倍,这与您所说的相反。此外,测量的尺寸是我所看到的整个线高,我假设 1 英寸指的是每 1 英寸 72 点?我测量的是 iPhone 上 72 磅字体时约 0.5 英寸。 如果有什么不清楚的地方请告诉我,但是没有 - 72 点/英寸与线高无关,除了相对,正如我试图解释的那样。还允许抗锯齿(+-2 像素)(记住它是矢量图稿大小加倍)您的表格确实显示加倍点大小使像素大小加倍。我不明白您对此有何不同的解释。 我还是不太明白你的意思。你说 72 点/英寸与线高无关,那么 72 点/英寸与什么有关系呢?另外,请注意 99.0 的值 - 您预计它会接近 10 点乘以 10 时的值,但实际上相差甚远。 事实上我为 100.0 点添加了一个,这也与 10 点乘以 10 的大小相差甚远。 如我所说,72 点/英寸与字体内部坐标系的变换有关。在 72points 中,1 个字体单位(字体坐标系没有名称)等于 72points。重要的是,没有办法从这些信息(我知道一个字体单元将是 72 点)到知道字形的像素大小是多少——这完全取决于字体。你试过不同的字体吗?试试日内瓦和信使。【参考方案2】:我不确定-[NSString sizeWithFont:]
是如何测量高度的。它是使用线高还是贝塞尔峰之间的差异?你用了什么文字?
我相信-[UIFont lineHeight]
会更好测量高度。
编辑:
另外,请注意,没有一种测量方法会返回以像素为单位的大小。它返回points
中的大小。您必须将结果乘以 [UIScreen mainScreen].scale
。
注意构造字体时使用的typographic points
和ios 中的points
之间的区别default logical coordinate space
。不幸的是,文档中没有很清楚地解释差异。
【讨论】:
lineHeight
也是分数,所以不幸的是与问题无关。我使用了文本@"A"
。但请记住,这也与问题无关。
@mattjgalloway 编辑了答案。有两个不同的单位,都称为point
。
但这也不对吧?我在屏幕比例方面了解点与像素,这是非常不同的。请注意我的结果表 - 就我所做的结果来看,该比率趋向于 1.16。似乎是一个奇怪的比例。
奇怪的是,我的结果中的点 => 像素似乎大约是 pixels = ROUND((1 + points) * (115 / 99))
。【参考方案3】:
我同意这很令人困惑。我试图在这里给你一些基本的解释,让事情更清楚。
首先,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 高。 (这就是为什么 Microsoft Word 文档在 Mac 上总是看起来更小,您通常需要缩放到 125%。)
最后在 iOS 上,非常相似,无论是 iPhone、iPod touch、iPad 还是 Apple Watch,iOS 使用非视网膜屏幕固定 72DPI,@2x 视网膜显示使用 144DPI,@3x 视网膜显示使用 216DPI在 iPhone 6 Plus 上。
忘记真正的英寸。它只存在于实际打印中,不用于显示。对于在屏幕上显示文本的软件来说,这只是与物理像素的人为比例。
【讨论】:
【参考方案4】:我首先想知道这是否与 [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 的特殊字符窗口中的数学符号部分。)
在-[NSString sizeWithFont:]
返回的CGSize
中,宽度占了字符串中具体的字符,而高度只反映了行数。行高是由字体指定的度量,与包含字体最大字符的“布局框”相关。
【讨论】:
好的,很好的解释。但我仍然不太完全理解 UIFont 术语中的“点”是什么。在屏幕上时,什么字体大小的哪一部分会测量出一定的大小?我喜欢关于ƒ的想法。我会玩的! 我在 72.0 点尝试了ƒ
,但它不是 72.0 像素高。它只是一个神奇的数字,它在 14 处起作用然后发散吗?仍然提出问题 - “什么是重点”。
与 UIFont
相关的点与 UIKit 几何中其他地方的点相同。它与渲染文本的对应方式是可变的。字体的“磅值”设置了一个边界高度,该高度通常与字形的上升-下降高度(以及总行高的一个子范围,其中一些可能被其他字形使用)相关联。但是,字体设计者可以在该几何图形中做任何他们想做的事情,因此字形大小可能与点大小不匹配,并且行高将始终(并且在给定字体中应该始终如此)多一点比点大小。
感谢这篇文章;你可能对这个问题感兴趣..***.com/questions/38203209/…@rickster【参考方案5】:
据我所知,事实是UIFont
撒谎。所有UIKit
都使用字体。如果你想知道真相,你需要使用CoreText
,但在很多情况下它会更慢! (因此,对于您的像素高度表,我认为它添加了某种 a + bx 因子,其中 x 是点大小。
那么它为什么要这样做呢?速度! UIKit
将东西四舍五入并调整间距,以便它可以缓存位图。或者至少那是我的收获!
【讨论】:
以上是关于UIFont 的磅值到底是多少?的主要内容,如果未能解决你的问题,请参考以下文章
泰山OFFICE技术讲座:字符间距的设置值大小,与标点压缩的关系