允许在UITextView

时间:2016-12-24 03:10:21

标签: ios uitextview

我有一个UITextView,可以让你写多行文字。

如何让用户在没有长按的情况下选择单词之间的字母?

目前,当使用触摸屏选择单词之间的字符时,光标可以是单词的开头或结尾:

示例:点击“c”将光标移动到单词的结尾

cursor at end

示例:点击“a”将光标移动到单词的开头

cursor at start

所需的游标行为:选择文本中的任何位置 enter image description here

允许在任何地方进行文字选择的功能(无需长按+放大镜)可在许多适用于iOS的代码编辑器应用中找到,例如CodaPythonista

1 个答案:

答案 0 :(得分:3)

这不是一个难以实现的挑战。

我将序言这种方法的问题是一致性。请记住,您的用户正在使用他们的手指,而不是stilii。手指具有大的表面积,并且击中精确的像素区域是非常困难的,尤其是对于小文本。我建议不要在模拟器中玩,你可以在一台设备上使用精确的指点设备。

第一个挑战是禁用默认点击行为或UITextView。这不是一项艰巨的任务 - 您可以在touchesBegan:withEvent:级别“攻击”问题,在那里您必须了解这些触摸的内容(单击与平移对比长按)或手势识别器级别,您可以禁用文本视图的私有手势识别器,专门处理光标移动(与其他触摸类型相比)。我已经为各种项目完成了后者,这是可能的。您也可以在不禁用默认行为的情况下尝试该方法,但随后光标可能会闪烁。测试并决定。

现在实现你所需要的。以某种方式获取触摸点(使用UIResponder API或手势识别器)。请记住,文本视图是一个滚动视图,其中包含绘制内容的大型子视图。您必须使用convertPoint: API将此触摸点从文本视图坐标系转换为内部视图的坐标系。完成后,您可以使用文本视图的布局管理器来获取触摸点处的字符索引:

NSUInteger chIdx = [self characterIndexForPoint:touchPoint inTextContainer:self.textContainer fractionOfDistanceBetweenInsertionPoints:NULL];

您可以使用此索引使用selectedRange属性设置文本视图的光标。