文章目录
  1. 1. 遇到的问题
  2. 2. 字符(Character)和字形(Glyphs)
    1. 2.1. 字符
    2. 2.2. 字形
  3. 3. 字形度量Glyph Metrics

Core Text是和Core Graphics配合使用的,一般是在UIView的drawRect方法中的Graphics Context上进行绘制的。 且Core Text真正负责绘制的是文本部分,图片还是需要自己去手动绘制,所以你必须关注很多绘制的细节部分。

遇到的问题

因为项目需要在工程里添加了自定义字体,但是遇到了一个问题:使用系统方法计算出来的字体高度和实际显示的高度偏差较大


红色背景区域为计算出来的高度

通过一番努力找到了原因:项目中使用的字体没有 下行高度

下面讲解下字形相关的知识:

字符(Character)和字形(Glyphs)

排版系统中文本显示的一个重要的过程就是字符到字形的转换。

字符

字符是信息本身的元素,而字形是字符的图形表征,字符还会有其它表征比如发音。字符在计算机中其实就是一个编码,某个字符集中的编码,比如Unicode字符集,就囊括了大都数存在的字符。

字形

字形是图形,一般都存储在字体文件中,字形也有它的编码,也就是它在字体中的索引。

一个字符可以对应多个字形(不同的字体,或者同种字体的不同样式:粗体斜体等);多个字符也可能对应一个字形,比如字符的连写( Ligatures)。


Roman Ligatures

字形度量Glyph Metrics

字形度量就是字形的各个参数:

  • bounding box(边界框),这是一个假想的框子,它尽可能紧密的装入字形。

  • baseline(基线),一条假想的线,一行上的字形都以此线作为上下位置的参考,在这条线的左侧存在一个点叫做基线的原点

  • ascent(上行高度),从原点到字体中最高(这里的高深都是以基线为参照线的)的字形的顶部的距离,ascent是一个正值

  • descent(下行高度),从原点到字体中最深的字形底部的距离,descent是一个负值(比如一个字体原点到最深的字形的底部的距离为2,那么descent就为-2)

  • linegap(行距),linegap也可以称作leading(其实准确点讲应该叫做External leading)

  • leading,文档说的很含糊,其实是上一行字符的descent到下一行的ascent之间的距离

所以字体的高度是由三部分组成的:leading + ascent + descent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CTFontRef ref = CTFontCreateWithName((CFStringRef)@"FZLTTHJW--GB1-0", fontsize, NULL);
CGFloat GetLineHeightForFont(CTFontRef iFont)
{
CGFloat lineHeight = 0.0;
// Get the ascent from the font, already scaled for the font's size
lineHeight += CTFontGetAscent(iFont);
// Get the descent from the font, already scaled for the font's size
lineHeight += CTFontGetDescent(iFont);
// Get the leading from the font, already scaled for the font's size
lineHeight += CTFontGetLeading(iFont);
return lineHeight;
}