UITextView中的光标位置

13

我正在寻找一种非私有的方法来找到 UITextView 中光标或插入符号(闪烁的竖线)的位置,最好是作为一个 CGPoint 返回。

可能已经有类似的问题了,但它并没有提供一种确定的方法来完成它。 并且, 我不是指所选区域的 NSRange


你能告诉我们更多背景信息,为什么你想要这样做吗? - Mike Abdullah
这是用于显示 UIMenuController 的。 - Joshua
4个回答

22

刚在另一个线程中找到:

需要iOS 3.2或更高版本。

CGPoint cursorPosition = [textview caretRectForPosition:textview.selectedTextRange.start].origin;

在调用此方法之前,请记得检查selectedTextRange不为nil。您还应该使用selectedTextRange.empty来检查它是否是光标位置而不是文本范围的开头。所以:

if (textview.selectedTextRange.empty) {
// get cursor position and do stuff ...
}

UITextView中光标的像素位置


1
+1 是的,这是关于 <UITextInput> 协议的。 - Dave DeLong
1
阅读文档时,人们可能会认为在iOS 4.3或更低版本中未实现此功能。但实际上,它仅适用于iOS5+。 - bobmoff

2

SWIFT 2.1版本:

let cursorPosition = infoTextView.caretRectForPosition( (infoTextView.selectedTextRange?.start)! ).origin

print("cursorPosition:\(cursorPosition)")

0

Swift 4 版本:

// lets be safe, thus if-let
if let selectedTextRange = textView.selectedTextRange {
    let caretPositionRect = textView.caretRect(for: selectedTextRange.start)
    let caretOrigin = caretPositionRect.origin
    print(">>>>> position rect: \(caretPositionRect), origin: \(caretOrigin)")
}

我们只需使用 textView.selectedTextRange 来获取选定的文本范围,然后使用 textView.caretRect(for:) 来获取定义插入符位置的 CGRect

0

没有这样的方法,就是这样。

你唯一能做的接近这个目标的方式就是使用 CoreText 在并行布局文本,在那里从一个点计算文本位置,并将其应用于 UITextView。然而,这仅适用于非 0 选择。此外,CoreText 有一个不同的文本布局引擎,例如支持字距,UITextView 不支持。这可能导致呈现和布局文本之间的偏差,从而产生次优的结果。

绝对没有办法定位光标。即使使用私有 API,这个任务也非常困难。这只是 iOS 中许多“不要”的事情之一。


那么没有任何方法可以计算插入符的位置吗? - Joshua
不行。不能使用UITextView。正如我所说的:你可以使用CoreText进行第二次文本布局并在那里计算位置,但这最多只能给出估计值。 - Max Seelemann

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