В некоторых ситуациях ответ ячменя не дает центральную часть выбора. Например:
В этом случае вы можете видеть, что меню Копировать / Вставить отображается в центре выделения, которое охватывает всю ширину текстового поля. Но вычисление центра двух каретных реек дало бы позицию намного дальше вправо.
Более точный результат можно получить с помощью 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)]) { …