如何从UITextView中获取选定的文本框架

我试图显示从UITextView选定的文本的矩形UIPopoverController ,我怎样才能得到选定的文本CGRect

谢谢!

我认为[UITextInput selectedTextRange][UITextInput caretRectForPosition:]是你在找什么。

[UITextInput selectedTextRange]以字符forms返回所选范围

[UITextInput caretRectForPosition:]返回此input中字符范围的CGRect

UITextView符合UITextInput (自iOS 5以来),所以你可以使用这些方法为你的UITextView实例。

这将是这样的事情。

 UITextRange * selectionRange = [textView selectedTextRange]; CGRect selectionStartRect = [textView caretRectForPosition:selectionRange.start]; CGRect selectionEndRect = [textView caretRectForPosition:selectionRange.end]; CGPoint selectionCenterPoint = (CGPoint){(selectionStartRect.origin.x + selectionEndRect.origin.x)/2,(selectionStartRect.origin.y + selectionStartRect.size.height / 2)}; 

编辑:由于示例代码变得有点难以获得,我添加了补充图像。

说明局部变量代表的图像

在某些情况下,大麦的回答实际上并不是select的中心。 例如:

截图显示了使用插入符号的位置的示例不准确

在这种情况下,您可以看到“复制/粘贴”菜单显示在select区域的中间,跨越文本区域的整个宽度。 但是,计算这两个插话的中心,会给右边一个更远的位置。

您可以使用selectionRectsForRange:获得更精确的结果selectionRectsForRange:

 UITextRange *selectionRange = [textView selectedTextRange]; NSArray *selectionRects = [self.textView selectionRectsForRange:selectionRange]; CGRect completeRect = CGRectNull; for (UITextSelectionRect *selectionRect in selectionRects) { if (CGRectIsNull(completeRect)) { completeRect = selectionRect.rect; } else completeRect = CGRectUnion(completeRect,selectionRect.rect); } 

另外值得说明的是,如果你仍然支持iOS 4并且使用这些答案,那么在调用它们之前,你需要确保这些方法被支持: if ([textView respondsToSelector:@selector(selectedTextRange)]) { …