我正在尝试在UIPopoverController
中的所选文字的矩形中显示UITextView
,如何获取所选文字CGRect
?
谢谢!
答案 0 :(得分:35)
我认为[UITextInput selectedTextRange]
和[UITextInput caretRectForPosition:]
正是您所寻找的。
[UITextInput selectedTextRange]
以字符
[UITextInput caretRectForPosition:]
返回此输入中字符范围的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)};
编辑:由于示例代码变得有点难以获得,我添加了一个图像以补充。
答案 1 :(得分:21)
在某些情况下,大麦的回答实际上不会给出选择的中心。例如:
在这种情况下,您可以看到复制/粘贴菜单显示在选区的中心,该菜单跨越文本字段的整个宽度。但计算两个插入符号的中心将使得位置更加靠右。
您可以使用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)]) { …
答案 2 :(得分:0)
Swift 5 版本:
if let selectionRect = textView.selectedTextRange {
let selectionRects = textView.selectionRects(for: selectionRect)
var completeRect = CGRect.null
for rect in selectionRects {
if (completeRect.isNull) {
completeRect = rect.rect
} else {
completeRect = rect.rect.union(completeRect)
}
}
}