核心文本 - 如何在iPhone上选择文本?

4

我需要在我的视图中使用Core Text来呈现富文本(简单格式化、一行文字中的多种字体等)。我想知道以这种方式呈现的文本是否可以使用(标准复制/粘贴功能)被用户选择?


最好选择@javsmo的答案,而不是当前的答案。它有7个赞。 - ppaulojr
我知道,这是一个非常好的答案,但它在被选中的答案之后几个月才出现(该答案也回答了我的问题)。我不确定这是否公平... - Lukasz
由于原回答者已删除其回答。 - ppaulojr
1个回答

27

我在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知道该点处于哪个字母上(或最近的字母)。

这里是一个截图。

使用CoreText绘制文本时选择文本

对于那个放大镜,我使用了这篇帖子中给出的代码。

编辑: 要绘制蓝色背景选择,您必须使用CGContextFillRect来绘制矩形。不幸的是,在NSAttributedString中没有背景颜色。


嗨,javsmo,你的例子看起来很棒!有没有可能给我发送一些源代码?非常感谢。汤姆 - TomTom
2
谢谢,@TomTom。我用CoreText绘制文本并进行选择的代码已经有将近500行了。没有任何解释的情况下发布它很复杂。你在哪个选择部分遇到了麻烦? - javsmo
嗨,javsmo。你太棒了,希望你能与我们分享。也许可以使用GitHub等方式...谢谢... - Sage
@PareshNavadiya,你有没有样例可以分享吗?我只能添加放大镜视图,之后就没有任何想法了。 - karthikeyan
这是8年前的事情了,但是你是画这些手柄还是制作那些图层并更新矩形呢?我现在正在实现类似的东西。我的绘制已经完成,但是手柄及其移动还没有。 - agibson007
所有的东西都在那个案例中绘制,包括手柄。最终它只是一个带有两个同心圆的垂直线。该应用程序仍然使用该代码,但我相信应该已经有人写好了解决这个问题的方法。 - javsmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接