如何从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)]) { …