检测轻拍的字符。 UITextView characterRangeAtPoint总是返回nil

我试图确定, UITextView哪个特定字符已被点击。 我试图使用characterRangeAtPoint:方法。 但它总是返回零,无论在UITextView我点击。 我甚至写了下面这段代码:

 for (int x = 0; x<1000; x++) { pos.x = x; for (int y = 0; y<1000; y++) { pos.y = y; UITextRange * range = [textView characterRangeAtPoint:pos]; if (range!=nil) { NSLog(@"x: %f, y: %f", pos.x, pos.y); } } } 

那么,它永远不会到达NSLogstring。 我究竟做错了什么?

这是一个iOS 7的错误。 characterRangeAtPoint:总是返回nil ,除非事先至lessselect了一些文本。

作为一种解决方法,您可以事先调用setSelectedRange:setSelectedTextRange:但是然后textView会突出显示您的select。 我想出了以下解决scheme:

 [textView select:textView]; [textView setSelectedTextRange:nil]; 

调用这两个方法后, characterRangeAtPoint:将按预期开始工作。

请注意,您只需在textView初始化后调用一次即可。

编辑:我的答案被编辑从“除非一些文字已被选中”“除非一些文字被选中” 。 这是错误的:文本不需要当前select,只需要select一次。 所有随后调用setSelectedRange:然后将成功,正如我的笔记所述。 进一步清晰编辑。

你的UITextView必须是可选的。 在故事板中,选中“可选”checkbox。

在代码中,

 textView.selectable = YES; 

这也是UITextView上的-closestPositionToPoint:方法所必需的。

使用shouldChangeCharactersInRange方法而不是characterRangeAtPoint。

并使用你的If条件放置循环语句。

你的TextView是用户可编辑的吗? 如果是,则尝试texViewDidChangeSelection方法。 每当光标(光标)在textView中移动时都会调用它。 然后通过textView.selectedRange.location获取光标位置指向插入索引。

我的假设是,你需要angular色相对于angular色数量的位置,而不是二维坐标。