从上到下而不是从左到右分发文本

时间:2014-08-18 18:13:41

标签: core-text

我正在开发一个使用CoreText实现多列文本布局的视图(使用CTFramesetter)。

CoreText通常会完全填充每一帧,因此当我使用构成我的列的三个rect调用CTFramesetterCreateFrame时,我得到的布局类似于下图:

Left-to-right layout

因此左列完全填充,中间列部分填充,右列填充为空。但相反,我希望文本分布在三列上,以便它们占用最小的垂直空间,如下图所示:

Top-to-bottom layout

如何使用CoreText实现这一目标?

我不介意在这里低级别,如果有必要,甚至可以手动绘制每个CTRun

我想出的一个想法是创建一个宽度为一列的大框架,然后找出要在哪一列中绘制的CTLine。但这有一些局限性:

  • 仅当所有列的宽度相同时才会起作用。
  • 它不适用于剪切路径。

不幸的是,我需要使用剪切路径(如在kCTFrameClippingPathsAttributeName中),所以这个想法已经出来了。不过,我可以使用固定的列宽限制。

另一个想法是减少高度,直到最后一帧溢出,但这是一种非常强力的方式,肯定会浪费资源。

(顺便说一句,由于兼容性要求,不可能使用像NSTextStorage这样的TextKit类;结果视图旨在用于Mac和iOS,但它需要在iOS< 7上工作

1 个答案:

答案 0 :(得分:1)

由于似乎不是一种非昂贵的方法来解决这个问题,所以我已经做到了这一点:

我确实选择"降低高度,直到最后一帧溢出" 逼近。为了减小高度,我只需要另一个剪切路径(kCTFrameClippingPathsAttributeName),它是一个矩形,可以将视图底部填充到所需的高度。

可能最昂贵但最简单的方法是增加矩形高度,直到最后文本不再适合最后一帧。

相反,我已经实现了二进制搜索。对于我的演示应用程序,我通常会在8-10次递归之后找到正确的高度,这仍然很昂贵,但至少它的像素完美并且不依赖于&#34以外的任何其他信息;最后一帧溢出"