Как я могу получить выделенный текстовый фрейм из UITextView - PullRequest
9 голосов
/ 31 декабря 2011

Я пытаюсь отобразить UIPopoverController из прямоугольника выделенного текста в UITextView, Как я могу получить выделенный текст CGRect?

Спасибо!

Ответы [ 2 ]

35 голосов
/ 31 декабря 2011

Я думаю [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

21 голосов
/ 08 марта 2013

В некоторых ситуациях ответ ячменя не дает центральную часть выбора. Например:

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

...