如何使用Core Text向后布局文本?

时间:2012-03-10 15:17:37

标签: ios layout drawing core-text

为了在页面中布置长字符串,我可以使用CTFramesetterCreateFrame创建CTFrameRef,然后在字符串中向前移动起始索引以创建下一个CTFrameRef。这很简单,因为开始索引正在向前发展,而Core Text API本身就支持这种布局。

现在我陷入了一种我想要转向上一页的情况

例如,长字符串的长度是1000,现在当前页面的起始索引(或CTFrameRef)是500,我想转到上一页,我怎么知道索引是什么开始?我无法缓存每个页面的所有索引或从字符串的开头计算,因为字符串可能非常长,不适合内存(我需要逐块读取文件中的字符串) 。我已经扫描了CT* API,没有这样的API支持向后排列文本。

有关于此的任何想法吗?

1 个答案:

答案 0 :(得分:1)

除此之外没有API的原因是除了尝试通过反复试验排版整个页面以找到最佳起始索引之外没有有效的与上下文无关的方法,正如您可以想象的那样密集的操作。

如果文字的每一页都有一个设定的宽度,而且只是一个矩形的CTFrame,那么你可以这样做:

  1. “估计”上一页的字符串范围(例如,假设它与当前页面的长度相同。
  2. 以合理的大因子(例如长度的1.5 / 2x)超出估计值,达到合理的水平。选择超调范围,使其从段落开头开始。
  3. 像往常一样创建一个具有该范围的框架,但使框架比平时大得多。
  4. 从画面获取行信息,并从最后逐行开始计算高度。
  5. 您可以从适合的第一行的索引中找到实际的上一页,并使用它来创建实际的CTFrame。
  6. 虽然这应该有用,但我仍然建议您尽可能找到避免这种情况的方法。请注意,只要您具有更复杂的分页算法,这就会中断,即使在这种情况下,它也会使用1.5 / 2x内存。以下是有关如何执行此操作的一些建议:

    1. 缓存索引(至少到当前位置。)每个页面可能包含大约1000个字符,因此您的缓存大小将是整个文本大小的0.1%,您必须在第一次显示文本时至少一次。您可以通过为每n页存储索引来使缓存更小。

    2. 如果适用,请将字符串分解为逻辑子字符串,例如基于分页符或分节符,然后将每个子字符串排版为一系列页面的整体。