UIFont的点数是多less?

我正在努力了解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像素? 还是纯粹从某个angular度来定义一个观点呢?

一个字体有一个内部坐标系统,把它想象成一个单位正方形,在这个单位正方形中,字体的vector坐标被指定为任意大小,以适应字体中的所有字形+ – 字体devise师select的任何数量的空白。

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

因此,在72点绘制“A”告诉你,它将是在同一字体中以36点绘制的“A”的两倍,并且绝对没有关于实际位图尺寸的其他内容。

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

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

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

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

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

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

首先,字体大小的测量是从最低的下降到最高的上升在正规的拉丁语文本 – 例如从“j”的底部到“k”的顶部,或者为了方便测量单个字符,高度“ƒ”。 (这是U + 0192“带小钩的拉丁小字母”,在美国的Mac键盘上可以很容易地用选项-F键入,当用户用它来缩短“文件夹”的时候。)你会注意到,以像素为单位的高度(在1x显示器上)与指定的字体大小相匹配 – 例如[UIFont systemFontOfSize:14] ,“ƒ”将是14像素高。 (测量大写字母“A”只占用字体大小测量的空间的任意部分,这部分可能会以较小的字体大小变化;当将字体向量渲染为像素时,“提示”修改结果以产生更清晰的屏幕文本。)

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

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

我同意这很混乱。 我想给你一些基本的解释,使事情更清楚。

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

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

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

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

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

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

那为什么要这样做? 速度! UIKit用间距四舍五入的东西和小提琴,以便它可以caching位图。 或者至less这是我的拿走!