У меня есть UITextView
файл с расширением NSAttributedString
. Эта строка содержит слова, которые я хотел бы сделать доступными, чтобы при нажатии на них мне перезванивали, чтобы я мог выполнить действие. Я понимаю, что UITextView
могу обнаруживать нажатия на URL-адрес и перезванивать моему представителю, но это не URL-адреса.
Мне кажется, что с iOS 7 и мощью TextKit это стало возможным, однако я не могу найти никаких примеров и не уверен, с чего начать.
Я понимаю, что теперь можно создавать настраиваемые атрибуты в строке (хотя я еще этого не делал), и, возможно, они будут полезны для определения, было ли нажато одно из волшебных слов? В любом случае, я до сих пор не знаю, как перехватить это касание и определить, по какому слову произошло касание.
Обратите внимание, что совместимость с iOS 6 не требуется.
источник
Обнаружение нажатий на текст с атрибутами с помощью Swift
Иногда новичкам бывает сложно понять, как все настроить (по крайней мере, это было для меня), поэтому этот пример немного полнее.
Добавьте
UITextView
в свой проект.Торговая точка
Подключите
UITextView
кViewController
розетке с именемtextView
.Настраиваемый атрибут
Мы собираемся создать собственный атрибут, сделав расширение .
Добавьте новый быстрый файл с помощью File> New> File ...> iOS> Source> Swift File . Вы можете называть это как хотите. Я называю свой NSAttributedStringKey + CustomAttribute.swift .
Вставьте следующий код:
Код
Замените код в ViewController.swift следующим. Обратите внимание на расширение
UIGestureRecognizerDelegate
.Теперь, если вы нажмете на «w» в «Swift», вы должны получить следующий результат:
Ноты
NSAttributedString.Key.foregroundColor
(цвет текста) со значениемUIColor.green
.Дальнейшее обучение
Этот ответ был основан на нескольких других ответах на этот вопрос. Помимо этого, см. Также
источник
myTextView.textStorage
вместоmyTextView.attributedText.string
Это немного измененная версия, основанная на ответе @tarmes. Я не мог заставить
value
переменную возвращать что-либо, кроме какnull
без настройки ниже. Кроме того, мне нужен был возвращенный полный словарь атрибутов, чтобы определить результирующее действие. Я бы написал это в комментариях, но, похоже, у меня нет представителя, чтобы сделать это. Заранее извиняюсь, если я нарушил протокол.Специальная настройка должна использоваться
textView.textStorage
вместоtextView.attributedText
. Как все еще обучающийся программист iOS, я не совсем уверен, почему это так, но, возможно, кто-то другой может нас просветить.Особые изменения в методе работы с краном:
Полный код в моем контроллере представления
источник
Создавать настраиваемые ссылки и делать то, что вы хотите, стало намного проще с iOS 7. Хороший пример есть у Рэя Вендерлиха.
источник
UITextView
не обнаруживал ссылки, даже когда я настроил его на обнаружение их через IB. (Я также сделал его невыбираемым)Пример WWDC 2013 :
источник
Я смог решить это довольно просто с помощью NSLinkAttributeName
Swift 2
источник
if URL.scheme == "cs"
иreturn true
вне его,if
чтобы онUITextView
мог обрабатывать обычныеhttps://
ссылки, которые нажимаютсяПолный пример для обнаружения действий с атрибутированным текстом с помощью Swift 3
Затем вы можете поймать действие с помощью
shouldInteractWith URL
метода делегата UITextViewDelegate, поэтому убедитесь, что вы правильно установили делегат.Подобным образом вы можете выполнять любые действия в соответствии с вашими требованиями.
Ура !!
источник
Это можно сделать с помощью
characterIndexForPoint:inTextContainer:fractionOfDistanceBetweenInsertionPoints:
. Это будет работать несколько иначе, чем вы хотели - вам нужно будет проверить, принадлежит ли повернутый символ волшебному слову . Но это не должно быть сложно.Кстати, я настоятельно рекомендую посмотреть Introduction Text Kit с WWDC 2013.
источник
В Swift 5 и iOS 12 вы можете создать подкласс
UITextView
и переопределитьpoint(inside:with:)
некоторые реализации TextKit, чтобы сделать доступными только некоторыеNSAttributedStrings
из них.В следующем коде показано, как создать
UITextView
который реагирует только на нажатие на подчеркнутыеNSAttributedString
в нем символы:InteractiveUnderlinedTextView.swift
ViewController.swift
источник
Это может работать нормально с короткой ссылкой, многозвенной в текстовом виде. Работает нормально с iOS 6,7,8.
источник
Используйте это расширение для Swift:
Добавьте
UITapGestureRecognizer
в текстовое представление с помощью следующего селектора:источник