如何从UITextView获取所选文本框架

时间:2011-12-30 20:38:40

标签: iphone ios cocoa-touch ipad uipopovercontroller

我正在尝试在UIPopoverController中的所选文字的矩形中显示UITextView,如何获取所选文字CGRect

谢谢!

3 个答案:

答案 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)};

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

An image that illustrates what local variables represent

答案 1 :(得分:21)

在某些情况下,大麦的回答实际上不会给出选择的中心。例如:

Screenshot showing an example of where using the caret rects would not be accurate

在这种情况下,您可以看到复制/粘贴菜单显示在选区的中心,该菜单跨越文本字段的整个宽度。但计算两个插入符号的中心将使得位置更加靠右。

您可以使用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)
            }
        }
    }