底部而不是左边

我正在研究一个使用CoreText(使用CTFramesetter )实现多列文本布局的CTFramesetter

CoreText通常会完全填充每一帧,所以当我使用构成列的三个CTFramesetterCreateFrame调用CTFramesetterCreateFrame时,我得到的布局与以下图像相似:

所以左栏填写完整,中间栏部分,右栏空白。 但相反,我希望文本分布在三列上,以便它们占用最少的垂直空间,就像本图中所示:

如何用CoreText实现这一点?

我不介意在这里进行低级别的操作,如果需要的话,即使手动绘制每个CTRun也是一个选项。

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

  • 它只会在所有列具有相同宽度时才起作用。
  • 它不适用于剪切路径。
  • 不幸的是,我需要使用剪切路径(如在kCTFrameClippingPathsAttributeName ),所以这个想法没有了。 不过,我可以承受固定的列宽限制。

    另一个想法是降低高度直到最后一帧溢出,但这是一种相当残酷的方式,肯定会浪费资源。

    (顺便说一句,由于compability的要求,像NSTextStorage这样的TextKit类的使用是不可能的;最终的视图旨在用于Mac和iOS,但它需要在iOS <7)上工作,


    由于似乎没有解决这个问题的非常昂贵的方法,所以我就是这么做的:

    我确实按照“降低高度直到最后一帧溢出”的方式行事。 为了减少高度,我只需要另一个剪切路径( kCTFrameClippingPathsAttributeName ),它是一个矩形,填充视图的底部到所需的高度。

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

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

    链接地址: http://www.djcxy.com/p/14381.html

    上一篇: bottom instead of left

    下一篇: CTFrameGetLineOrigins Bug