我需要在我的视图中使用Core Text来呈现富文本(简单格式化、一行文字中的多种字体等)。我想知道以这种方式呈现的文本是否可以使用(标准复制/粘贴功能)被用户选择?
我在CoreText中实现了文本选择。这是一项真正艰苦的工作...但它是可行的。
基本上,您需要使用CTFrameGetLineOrigins
(1)、CTLineGetTypographicBounds
(2)、CTLineGetStringRange
(3)和CTLineGetOffsetForStringIndex
(4)保存所有CTLine
矩形和原点。
如下所示,线条矩形可以使用原点(1)、上升(2)、下降(2)和偏移量(3)(4)来计算。
lineRect = CGRectMake(origin.x + offset,
origin.y - descent,
offset,
ascent + descent);
在这之后,您可以循环这些行来测试哪一行具有触摸点(始终记住CoreText使用反向Y坐标)。
知道有触摸点的行之后,您可以使用CTLineGetStringIndexForPosition
知道该点处于哪个字母上(或最近的字母)。
这里是一个截图。
对于那个放大镜,我使用了这篇帖子中给出的代码。
编辑:
要绘制蓝色背景选择,您必须使用CGContextFillRect
来绘制矩形。不幸的是,在NSAttributedString
中没有背景颜色。