底部而不是左边
我正在研究一个使用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