有几篇文章指出了从 CTFramesetterSuggestFrameSizeWithConstraints 中获得精确高度的困难,在这里,(framesetter post),@Chris DeSalvo 给出了看起来像是最终修复的方法:添加具有正确行距调整的段落样式设置。
DeSalvo 通过从其 lineHeight 中删除 UIFont 的上升器和下降器来获得他的“领先”。我想知道这将如何比较CTFontGetLeading
。
我使用这样创建的字体:
CTFontRef fontr = CTFontCreateWithName((CFStringRef)@"Helvetica Neue", 16.0f, NULL);
UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:16.0f];
价值观完全不同:
- 0.448 CTFontGetLeading
- 2.360 DeSalvo 的公式:UIFont lineHeight - assender + descender
以下是一些其他 UIFont 值:
- 21.000 UIFont 的 lineHeight
- 15.232 UIFont 的上升器(基线的 Y 坐标)
- -3.408 UIFont 的下降器(从基线的 Y 坐标)
- 08.368 UIFont 的 xHeight
以下是 Ken Thomases 询问的 CTFont 值:
- 11.568001 CTFontGetCapHeight
- 08.368 CTFontGetXHeight
- -15.216001、-7.696001、38.352001、24.928001 CTFontGetBoundingBox
- 15.232 CTFontGetAscent
- 03.408 CTFontGetDescent (参考类说“根据字体参考的点大小和矩阵缩放的缩放字体下降度量”——这显然意味着它是 Y 坐标相对于基线的绝对值?)
我注意到 UIFont 以前有一个专门用于“领先”的属性,但它已被弃用,建议我们lineHeight
改用它。所以 UIFont 认为leading 是21和 CTFontRef .448对于相同的字体?有什么不对劲。
三个问题:
- “领先”真的是 kCTParagraphStyleSpecifierLineSpacingAdjustment 的意思吗?
- 如果是这样,我应该使用哪种方法/公式来获取它?
- 如果没有,我应该使用什么来调整行距?