ios - 允许在 UITextView 中的任何位置选择光标

标签 ios uitextview

我有一个 UITextView,可让您编写多行文本。

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

目前,当使用触摸屏选择单词之间的字符时,光标会移动到单词的开头或结尾:

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

cursor at end

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

cursor at start

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

允许在任何地方选择文本(无需长按 + 放大镜)的功能在许多 iOS 代码编辑器应用程序中都有,例如 CodaPythonista .

最佳答案

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

我将在序言中说明这种方法的问题是一致性。请记住,您的用户正在使用他们的手指,而不是 stilii。手指的表面积很大,击中精确的像素区域非常困难,尤其是对于小文本。我建议不要在模拟器中玩游戏,因为模拟器中有精确的定位设备,而应在设备上玩。

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

现在实现你所需要的。以某种方式获取触摸点(使用 UIResponder API 或手势识别器)。请记住, TextView 是一个 ScrollView ,其中包含一个大型 subview ,内容被绘制到其中。您必须使用 convertPoint: API 将此触摸点从 TextView 坐标系转换为内部 View 的坐标系。一旦你有了它,你就可以使用 TextView 的布局管理器来获取触摸点的字符索引:

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

您可以使用此索引通过 selectedRange 属性设置 TextView 的光标。

关于ios - 允许在 UITextView 中的任何位置选择光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309999/

相关文章:

ios - 在 UITextView 中着色 NSMutableAttributedString 给出奇怪的结果

iphone - UItextView iOS 7 问题

ios - 在嵌套 block 中引用 weak self

ios - 无法通过某些本地化的 pod spec lint 验证

iOS Swift 你如何安全编码/解码时间间隔以与 NSSecureCoding 兼容?

ios - 如何在 iOS 中更新保存到数据库的文本

ios - 如何管理多个异步 NSURLConnection 请求

objective-c - ShareKit/Twitter 内存泄漏

ios - 动画化 UITextInput 的 textInputView

iphone - 以编程方式关注 UITextView 不起作用