我正在开发一个使用CoreText实现多列文本布局的视图(使用CTFramesetter
)。
CoreText通常会完全填充每一帧,因此当我使用构成我的列的三个rect调用CTFramesetterCreateFrame
时,我得到的布局类似于下图:
因此左列完全填充,中间列部分填充,右列填充为空。但相反,我希望文本分布在三列上,以便它们占用最小的垂直空间,如下图所示:
如何使用CoreText实现这一目标?
我不介意在这里低级别,如果有必要,甚至可以手动绘制每个CTRun
。
我想出的一个想法是创建一个宽度为一列的大框架,然后找出要在哪一列中绘制的CTLine
。但这有一些局限性:
不幸的是,我需要使用剪切路径(如在kCTFrameClippingPathsAttributeName
中),所以这个想法已经出来了。不过,我可以使用固定的列宽限制。
另一个想法是减少高度,直到最后一帧溢出,但这是一种非常强力的方式,肯定会浪费资源。
(顺便说一句,由于兼容性要求,不可能使用像NSTextStorage
这样的TextKit类;结果视图旨在用于Mac和iOS,但它需要在iOS< 7上工作
答案 0 :(得分:1)
由于似乎不是一种非昂贵的方法来解决这个问题,所以我已经做到了这一点:
我确实选择"降低高度,直到最后一帧溢出" 逼近。为了减小高度,我只需要另一个剪切路径(kCTFrameClippingPathsAttributeName
),它是一个矩形,可以将视图底部填充到所需的高度。
可能最昂贵但最简单的方法是增加矩形高度,直到最后文本不再适合最后一帧。
相反,我已经实现了二进制搜索。对于我的演示应用程序,我通常会在8-10次递归之后找到正确的高度,这仍然很昂贵,但至少它的像素完美并且不依赖于&#34以外的任何其他信息;最后一帧溢出" 。