Как получить значение диапазона текста в UITextView из места касания?

У меня есть UITextView с текстом. Мне нужно получить точное значение диапазона символа/строки из выбранного местоположения. Я установил TapGestureRecognizer для UITextView. В своем методе действия мне нужно получить диапазон нажатого местоположения. Как это возможно? Я протестировал некоторые ответы из Stackoverflow, но они не были идеальными. Заранее спасибо.


person Shaheer Palollathil    schedule 15.08.2014    source источник


Ответы (1)


Вы смотрели документацию UITextView?

https://developer.apple.com/library/ios/documentation/uikit/reference/uitextview_class/Reference/UITextView.html#//apple_ref/occ/instp/UITextView/selectedRange

Вы можете использовать этот метод selectedRange для определения диапазона текста, выбранного пользователем.

Позднее редактирование: за это совсем недавно проголосовали против, и это дало мне возможность перечитать свой ответ, и я бы тоже проголосовал за свой ответ трехлетней давности.

Обновленный ответ:

Если есть одно касание, само действие касания должно содержать необходимую вам информацию. По сути, здесь вам понадобятся сами события UITouch, например, чтобы вычислить, где произошло прикосновение по отношению к тому, где должен быть ваш текст. Это позволит вам узнать, какая часть текста была закрыта пальцем пользователя.

Честно говоря, я не уверен, что для этого существуют какие-либо сторонние решения, но могу поспорить, что cocoapods.org будет хорошее место для начала с ключевого слова UITextView tap, если не сам Github с ключевыми словами: cocoapod uitextview.

Если бы я реализовывал такое решение с событиями UITouch, используя свойства, описанные в docs Я бы использовал The location of the touch within the view or window , заданный классом.

Манипулируя одной рукой CGPoints из: https://developer.apple.com/documentation/uikit/uitouch/1618116-location, вы можете использовать механизмы String для определения размера текста в заданном шрифте.

Хотя это решение предназначено для UILabel, оно может:

(a) использоваться по-другому, но, надеюсь, точно так же в UITextView

OR

(b) Я видел, как манекен UILabel использовался просто для расчета размеров текста в функциях, требующих такой точности. Обычно это довольно эффективно, так как изменение строки UILabel не требует больших затрат, а UILabel имеет встроенные свойства для расчета размера на основе текста и шрифта без необходимости выполнения прохода макета.

Опять же, извиняюсь, если первый оригинальный ответ показался дерзким, теперь он действительно выглядит так, как я вижу. Однако я подтвержу, что мой первоначальный ответ остается в силе (механизм selectedRange) СЛЕДУЕТ, чтобы желаемое решение было в виде длительного нажатия. Тем не менее, для пользовательского решения, основанного на одном событии касания, сбор UITouch событий с помощью обратного вызова делегата, а затем обработка тех, кто знает, что String присутствует, является лучшим подходом, насколько я могу судить.

person BHendricks    schedule 15.08.2014
comment
Мы не получим выбранный диапазон одним нажатием. Мне нужен диапазон от одного нажатия вместо выбора текста из текстового просмотра двойным нажатием. - person Shaheer Palollathil; 15.08.2014
comment
Что вы имеете в виду диапазон от одного нажатия? Диапазон от где до где, если он нажимается только один раз? - person BHendricks; 15.08.2014
comment
Кто минусовал, спасибо. Может показаться, что вам просто что-то не понравилось, но на самом деле это побудило меня перечитать это и пересмотреть свой ответ, и в конечном итоге позволило мне обновить свой ответ гораздо более подробным описанием. Для тех, кто смотрел, я надеюсь, что ответ поможет, и, пожалуйста, прокомментируйте любые разъяснения, которые я еще могу добавить! :) - person BHendricks; 29.08.2017