给予Framesetter正确的行距调整[英] Giving Framesetter the correct line spacing adjustment

本文是小编为大家收集整理的关于给予Framesetter正确的行距调整的处理方法,想解了给予Framesetter正确的行距调整的问题怎么解决?给予Framesetter正确的行距调整问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

一些帖子指出难以从 CTFramesetterSuggestFrameSizeWithConstraints 获得准确高度,这里,(framesetter帖子),@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(类 ref 说"根据字体参考的点大小和矩阵缩放的缩放字体下降度量"——这显然意味着它是 Y 坐标相对于基线的绝对值?)

我注意到 UIFont 以前有一个专门用于"领先"的属性,但它已被弃用,建议我们改用 lineHeight.所以 UIFont 认为leading 是 21 和 CTFontRef .448 对于相同的字体?有点不对劲.

三个问题:

  1. "领先"真的是 kCTParagraphStyleSpecifierLineSpacingAdjustment 的意思吗?
  2. 如果是,我应该使用哪种方法/公式来获取它?
  3. 如果不是,我应该用什么来调整行距?

推荐答案

回答我上面的三个问题:

  1. 是的,"领先"实际上是 kCTParagraphStyleSpecifierLineSpacingAdjustment 的意思.或者无论如何,它按预期工作.
  2. 使用 CTFontGetLeading(fontRef) 获取字体的正常前导,或插入您选择的任何值(作为 CGFloat).
  3. 不适用.

答案 1 和 2 有效:在属性字符串的段落样式属性中指定前导值将使 Core-Text 框架设置器能够准确地计算其高度.

有两个注意事项:

  1. 如果您尝试以增量方式计算高度,一次一个字符串,每个字符串都包含一个初始换行符,framesetter 会认为该换行符代表一整行,而不仅仅是前导.如果您想要连接字符串的高度,则必须将该连接提供给框架设置器.当然,您可以跟踪增量的高度差异,但无法避免让 framesetter 重新计算早期的字符串尺寸.
  2. CATextLayer 忽略间距调整(和其他属性).如果按确切的字符串高度取帧是个问题,您必须直接绘制到 CALayer.

还有一个谜团:UIFont 被弃用的领先是怎么回事?Leading 和 lineHeight 是两个不同的东西.

本文地址:https://www.itbaoku.cn/post/924420.html