2012-08-02 58 views
45

我正在努力准确理解UIFont中的点大小的含义。这不是像素,它似乎不是标准的定义,即它们与1/72英寸相关。UIFont的磅值是多少?

我计算出使用-[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像素?或者纯粹是从其他角度来定义一个观点?

+0

你有没有检查过这个问题:http://stackoverflow.com/questions/1059101/font-size-in-pixels? – tiguero 2012-08-02 11:56:14

+0

是的,如果你读到,你会看到为什么我期望我上表中的72的值为163像素。但它不,它是*方式*关闭。 – mattjgalloway 2012-08-02 11:59:21

+0

我不遵循你的论点;只是因为你使用72磅字体来测量字母“A”的大小(以像素为单位)只是表明它将占用大约半英寸的空间。你似乎认为字母“A”应占用一英寸的屏幕。 – trojanfoe 2012-08-02 13:05:35

回答

11

一个字体有一个内部坐标系统,可以认为它是一个单位正方形,在这个坐标系统内,字体的矢量坐标被指定为任意大小,以适应字体中的所有字形+ - 字体设计师选择的任何空白量。

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

所以,在72点绘制'A'会告诉你它将是在同一字体中以36点绘制的'A'的两倍高,而且对于实际位图大小将是什么都没有。

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

+2

所有好的解释,但不是我所看到的。请注意,倍增点大小不会使像素大小加倍,这与您所说的相反。此外,测量的尺寸是我所能看到的整个线高度,我认为这是1英寸每英寸72点所指的高度?我测量的是iPhone上72点字体的〜0.5英寸。 – mattjgalloway 2012-08-02 20:52:18

+0

如果有什么不清楚的地方,请让我知道,但没有--72点/英寸与线高无关,除了相对的,正如我试图解释的。还允许抗锯齿(+ 2像素)(记住它是矢量图形大小的两倍),您的表格显示倍增点大小是像素大小的两倍。我不明白你是如何解释这个不同的。 – hooleyhoop 2012-08-02 21:20:46

+1

我还是不太明白你的意思。你说72英寸/英寸与线高无关,但是72英寸/英寸与那个相关呢?此外,请注意99.0的值 - 您希望它接近10点乘以你的解释乘以10的值,但它的方式不对。 – mattjgalloway 2012-08-03 08:18:00

5

我不知道-[NSString sizeWithFont:]如何测量身高。它使用线高度还是贝塞尔峰之间的差异?你使用了什么文字?我认为-[UIFont lineHeight]会更好地测量身高。

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

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

+0

'lineHeight'也是在点,所以与不幸的问题无关。我使用了文字“@”A“'。但请记住,这与问题无关。 – mattjgalloway 2012-08-02 12:11:43

+0

@mattjgalloway编辑答案。有两种不同的单位,都称为“点”。 – Sulthan 2012-08-02 12:19:14

+0

但是这不正确吗?就屏幕比例而言,我知道点与像素的关系,这是非常不同的。注意我的结果列表 - 根据我的观察结果,这个比例趋于1.16。似乎是一个奇怪的比例。 – mattjgalloway 2012-08-02 12:22:59

3

我首先想知道这是否与[CSS像素定义为每英寸96] [1]的方式有关,而UI布局点定义为每英寸72。 (当然,“英寸”与物理英寸无关。)为什么Web标准会影响UIKit业务?那么,您可能会注意到,在调试器中检查堆栈跟踪或崩溃报告时,即使您没有使用UIWebView,UIKit也存在一些WebKit代码。实际上,它比这更简单。首先,字体大小是从最低的下行到最高的上行,以常规的拉丁文字 - 例如,从“j”的底部到“k”的顶部,或者为了方便测量单个字符,“ƒ”的高度。 (这就是U + 0192“带拉钩的拉丁小字母F”,在美国的Mac键盘上可以轻松地使用选项-F键入。)当您使用该方案进行测量时,人们会用它来缩短“文件夹”以像素为单位的高度(在1x显示器上)与指定的字体大小相匹配 - 例如与[UIFont systemFontOfSize:14],“ƒ”将是14像素高。 (测量大写字母“A”只占用字体大小测量的空间的任意部分,这部分可能会更小的字体大小;当将字体向量渲染为像素时,“提示”修改结果以产生更清晰的屏幕文本)

但是,字体包含各种不符合该度量标准定义的空间的字形。在东欧语言中上行语的上方有一些变音符号,并且所有标点符号和特殊字符都适合在“布局框”中。 (请参阅Mac OS X的特殊字符窗口中的数学符号部分以获得大量示例。)

在由-[NSString sizeWithFont:]返回的CGSize中,宽度占用字符串中的特定字符,但高度只反映了行数。行高度是由字体指定的度量标准,并与包含字体最大字符的“布局框”相关。

+0

好的,很好的解释。但是我仍然不完全理解UIFont中的“点”是什么。什么字体大小会在屏幕上测量一定的大小?但我喜欢关于ƒ的想法。我会玩! – mattjgalloway 2012-08-03 08:16:19

+0

我在72.0点试过了一个'ƒ',它不是72.0像素高。这只是一个神奇的数字,它在14的地方起作用,然后分歧?仍然要回答这个问题 - “有什么意义”。 – mattjgalloway 2012-08-03 08:30:38

+0

与UIFont相关的一点与UIKit几何中的其他位置相同。它如何对应于呈现的文本是可变的。字体的“点大小”设置一个边界高度,该边界高度通常与字形的上行 - 下行高度(以及总行高的子范围,其中一些可能被其他字形使用)相连。然而,字体设计人员可以在该几何体中做任何他们想做的事情,因此字形大小可能与点大小不匹配,并且线高度始终(并且应该在给定字体内一致)比点大小多一点。 – rickster 2012-08-03 23:20:01

0

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

那么它为什么这样做呢?速度!UIKit将东西和小提琴间距,以便它可以将位图缓存。或者说,是我夺走至少!

2

我同意这是非常混乱。我想在这里给你一些基本的解释,以使事情更清晰。

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

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

三,电脑显示器搞砸了DPI,以及同时点的定义。计算机显示器的分辨率由它们的原生像素来描述,例如1024 x 768或1920 x 1080.软件实际上并不关心显示器的物理尺寸,因为如果它们按比例缩放屏幕内容(如在纸上打印),所有东西都会很模糊 - 只是物理分辨率不够高,无法让所有的事情变得顺利和合法。软件使用了一种非常简单而又死气沉沉的方式:固定DPI,适用于您使用的任对于Windows,它是96DPI;对于Mac,它是72DPI。这就是说,无论显示器上有多少像素都会变成一寸,软件就会忽略它。当操作系统在72pt中渲染文本时,它在Windows上总是96px高,在Mac上总是高72px。 (这就是为什么微软Word文档在Mac上总是显得更小,而你通常需要变焦到125%。)

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

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