Я искал это в течение нескольких часов, но я потерпел неудачу. Я, вероятно, даже не знаю, что я должен искать.
Многие приложения имеют текст и в этом тексте гиперссылки в вебе с закругленными углами. Когда я нажимаю на них, UIWebView
открывается. Что меня удивляет, так это то, что они часто имеют пользовательские ссылки, например, если слова начинаются с #, на них также можно нажимать, и приложение отвечает, открывая другое представление. Как я могу это сделать? Это возможно с UILabel
или мне нужно UITextView
или что-то еще?
ios
hyperlink
uilabel
nsattributedstring
uitapgesturerecognizer
бег вприпрыжку
источник
источник
Swift 4
решения. Он использует,UITextView
но заставляет его вести себя какUILabel
. Я попробовал решения здесь, и не смог получить точное обнаружение ссылки.Ответы:
В общем, если мы хотим, чтобы в тексте UILabel отображалась кликабельная ссылка, нам нужно было бы решить две независимые задачи:
Первый легко. Начиная с iOS 6 UILabel поддерживает отображение приписанных строк. Все, что вам нужно сделать, это создать и настроить экземпляр NSMutableAttributedString:
Это оно! Приведенный выше код заставляет UILabel отображать строку со ссылкой
Теперь мы должны обнаружить касания по этой ссылке. Идея состоит в том, чтобы перехватить все ответвления в UILabel и выяснить, было ли расположение ответвления достаточно близко к ссылке. Чтобы поймать прикосновения, мы можем добавить распознаватель жестов к ярлыку. Не забудьте включить userInteraction для метки, по умолчанию она отключена:
Теперь самое сложное: выяснить, был ли тап в том месте, где отображается ссылка, а не в какой-либо другой части ярлыка. Если бы у нас был ULabel с одной линией, эту задачу можно было бы относительно легко решить путем жесткого кодирования границ области, в которой отображается ссылка, но давайте решим эту проблему более элегантно и в общем случае - многострочную UILabel без предварительного знания структуры ссылок.
Одним из подходов является использование возможностей API Text Kit, представленных в iOS 7:
Сохраните созданные и настроенные экземпляры NSLayoutManager, NSTextContainer и NSTextStorage в свойствах вашего класса (скорее всего, потомка UIViewController) - они нам понадобятся в других методах.
Теперь каждый раз, когда метка меняет свой фрейм, обновляйте размер textContainer:
И, наконец, определите, был ли кран точно по ссылке:
источник
cellForRowAtIndexPath
? Я создаю и настраиваю экземпляры внутриcellForRowAtIndexPath
и размещаюhandleTapOnLabel
функцию в нем тоже. Ноcell.textLabel.addGestureRecognizer(UITapGestureRecognizer(target: cell, action: "handleTapOnLabel:"))
я получаюunrecognized selector
.textAlignment
атрибут метки установлен вNSTextAlignmentCenter
. Если вы используете нецентрированный текст, вам необходимо настроить егоtextContainerOffset
в приведенном выше коде.x
значенияtextContainerOffset
используется константа0.5
. Это рассчитает правильную позицию дляNSTextAlignmentCenter
. Для выравнивания по левому краю, натуральному или выровненному, используйте значение0.0
. Для выравнивания вправо используйте1.0
.Я простирающийся @NAlexN оригинальный подробное решение, с @zekel отличным расширением
UITapGestureRecognizer
, а также предоставление в Swift .Расширение UITapGestureRecognizer
использование
Настройка
UIGestureRecognizer
для отправки действийtapLabel:
, и вы можете определить, включены ли целевые диапазоныmyLabel
.ВАЖНО: Режим
UILabel
разрыва строки должен быть установлен на перенос по словам / символу. Каким-то образомNSTextContainer
будет предполагаться, что текст представляет собой одну строку только в том случае, если режим разрыва строки установлен иначе.источник
targetRange1
иtargetRange2
.NSMutableAttributedString(attributedString: text)
«text»NSAttributedString
Старый вопрос, но если кто-то может использовать
UITextView
вместоUILabel
, то это легко. Стандартные URL-адреса, номера телефонов и т. Д. Будут автоматически обнаружены (и будут активными).Тем не менее, если вам нужно пользовательского обнаружения, то есть, если вы хотите , чтобы иметь возможность вызвать любой пользовательский метод после того, как пользователь нажимает на конкретное слово, вам нужно использовать
NSAttributedStrings
сNSLinkAttributeName
атрибутом , который будет указывать на схеме пользовательских URL (в отличие от имея схему http url по умолчанию). Рэй Wenderlich покрыл это здесьЦитирование кода из вышеупомянутой ссылки:
Чтобы обнаружить эти клики по ссылкам, выполните это:
PS: убедитесь, что вы
UITextView
естьselectable
.источник
UIButtonTypeCustom - это кликабельная метка, если для нее не установлены изображения.
источник
(Мой ответ основан на превосходном ответе @ NAlexN . Я не буду дублировать его подробное объяснение каждого шага здесь.)
Мне было наиболее удобно и просто добавить поддержку UILabel-текста с возможностью касания в качестве категории в UITapGestureRecognizer. (Вам не нужно использовать детекторы данных UITextView, как предлагают некоторые ответы.)
Добавьте следующий метод в вашу категорию UITapGestureRecognizer:
Пример кода
Жест обратного вызова
источник
plainText.length
.UITapGestureRecognizer
. Вот некоторая информация о добавлении категорий.UITextView
поддерживает детекторы данных в OS3.0, тогда какUILabel
нет.Если вы включите детекторы данных,
UITextView
и ваш текст содержит URL-адреса, номера телефонов и т. Д., Они будут отображаться в виде ссылок.источник
hashtag://
или что-то в этом роде, а затем используйте ееtextView(_:shouldInteractWith:in:interaction:)
для обнаружения. См. Ответ ниже: stackoverflow.com/a/34014655/1161906Перевод расширения @ samwize в Swift 4:
Чтобы настроить распознаватель (как только вы раскрасили текст и прочее):
... тогда распознаватель жестов:
источник
didTapAttributedTextInLabel
нуждаетсяNSRange
в качестве аргумента, ноrangeTerms
возвращает что-то другое. ТакжеhandleTapOnLabel
функция должна быть помечена@objc
в Swift 4.Как я уже упоминал в этом посте , вот легковесная библиотека, которую я создал специально для ссылок в UILabel FRHyperLabel .
Для достижения такого эффекта:
Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Pellentesque quis blandit eros, садитесь за руль. Нам на урне нек. Maecenas ac sem e se se porta dictum necvel Tellus.
используйте код:
источник
Я создал подкласс UILabel с именем ResponsiveLabel, который основан на API textkit, представленном в iOS 7. Он использует тот же подход, который был предложен NAlexN . Это обеспечивает гибкость, чтобы указать шаблон для поиска в тексте. Можно указать стили, которые будут применяться к этим шаблонам, а также действие, которое будет выполняться при нажатии на шаблоны.
Если вы хотите сделать строку кликабельной, вы можете сделать это так. Этот код применяет атрибуты к каждому вхождению строки «текст».
источник
Работал в Swift 3, вставив весь код сюда
источник
Вот пример кода для гиперссылки UILabel: Источник: http://sickprogrammersarea.blogspot.in/2014/03/adding-links-to-uilabel.html
источник
Вот быстрая версия ответа NAlexN.
Затем вы можете создать экземпляр этого класса внутри вашего
viewDidLoad
метода следующим образом:Лучше иметь собственный атрибут, который будет использоваться при касании персонажа. Теперь это
NSLinkAttributeName
, но может быть что угодно, и вы можете использовать это значение, чтобы делать другие вещи, кроме открытия URL-адреса, вы можете выполнять любые пользовательские действия.источник
Мне было трудно с этим справиться ... UILabel со ссылками на атрибутивный текст ... это просто головная боль, поэтому я в конечном итоге использовал ZSWTappableLabel .
источник
Как и в предыдущем ответе, UITextView может обрабатывать касания по ссылкам. Это можно легко расширить, заставив другие части текста работать как ссылки. Библиотека AttributedTextView является подклассом UITextView, который очень легко справляется с ними. Для получения дополнительной информации см .: https://github.com/evermeer/AttributedTextView
Вы можете заставить любую часть текста взаимодействовать следующим образом (где textView1 - это UITextView IBOutlet):
А для обработки хэштегов и упоминаний вы можете использовать такой код:
источник
Я расширяю ответ @ samwize для обработки многострочной UILabel и приведу пример использования UIButton.
источник
Я следую этой версии,
Свифт 4:
Пример звонка:
источник
Я нашел другое решение:
Я нахожу способ обнаружить ссылку в HTML-тексте, который вы находите в Интернете, и преобразуете его в nsattributeString с помощью:
Мой метод позволяет обнаруживать гиперссылки, не указывая их.
Сначала вы создаете расширение для распознавателя tapgesture:
}
затем в просмотре контроллера вы создали список URL-адресов и диапазонов для хранения всех ссылок и диапазона, который содержит текст атрибута:
чтобы найти URL и URLRange вы можете использовать:
Затем вы реализуете ручку крана:
и здесь мы идем!
Я надеюсь, что это решение поможет вам, как оно поможет мне.
источник
Для полностью настраиваемых ссылок вам нужно будет использовать UIWebView - вы можете перехватывать вызовы, чтобы вы могли перейти к какой-то другой части вашего приложения вместо нажатия ссылки.
источник
Вот раскрывающаяся категория Objective-C, которая включает кликабельные ссылки в существующих
UILabel.attributedText
строках, используя существующийNSLinkAttributeName
атрибут.Это было бы немного чище, если бы вы делали это через подкласс UILabel (т. Е. Ни один из беспорядков objc_getAssociatedObject), но если вы похожи на меня, вы предпочитаете избегать создания ненужных (сторонних) подклассов, просто чтобы добавить некоторую дополнительную функцию к существующим классам UIKit. Кроме того, это прекрасно, что он добавляет кликабельные ссылки на любую существующую UILabel, например, существующую
UITableViewCells
!Я попытался сделать его как можно более инвазивным, используя существующий
NSLinkAttributeName
атрибут, уже доступный в NSAttributedString. Так что это просто, как:По сути, это работает, добавив
UIGestureRecognizer
к вашей UILabel. Выполнена тяжелая работаgestureRecognizerShouldBegin:
, которая перекомпоновывает строку attributeText, чтобы выяснить, какой символ был нажат. Если этот символ был частью NSLinkAttributeName, впоследствии gestRecognizer сработает, получит соответствующий URL (из значения NSLinkAttributeName) и откроет ссылку в соответствии с обычным[UIApplication.sharedApplication openURL:url]
процессом.Примечание - делая все это в
gestureRecognizerShouldBegin:
, если вам не удастся нажать на ссылку в метке, событие передается. Так, например, ваш UITableViewCell будет захватывать нажатия на ссылки, но в остальном будет вести себя нормально (выберите ячейку, отмените выбор, прокрутите, ...).Я поместил это в репозиторий GitHub здесь . Адаптировано из SO Kai Burghardt, размещающей здесь .
источник
Создайте класс со следующими файлами .h и .m. В файле .m есть следующая функция
Внутри этой функции мы проверим диапазоны подстрок, для которых нам нужно выполнить действия. Используйте свою собственную логику, чтобы поставить свои диапазоны.
И следующее использование подкласса
ниже .h файл
Следующий файл .m
источник
Я настоятельно рекомендую использовать библиотеку, которая автоматически распознает URL-адреса в тексте и преобразует их в ссылки. Пытаться:
Оба находятся под лицензией MIT.
источник
основываясь на ответе Чарльза Гэмбла, это то, что я использовал (я удалил некоторые строки, которые смутили меня и дали мне неправильный индекс):
источник
Встраиваемое решение в виде категории
UILabel
(предполагается, что выUILabel
используете атрибутивную строку с некоторымиNSLinkAttributeName
атрибутами в ней):источник
Вот реализация Swift, которая настолько минимальна, насколько это возможно, и включает в себя обратную связь касанием. Предостережения:
"\u{a0}"
).link
ключами,
источник
Этот универсальный метод тоже работает!
И вы можете вызвать метод с
источник
UITapGestureRecognizer
? Это выход? Свойство вы настраиваете?Вот мой ответ , основанный на @Luca ДаВанзо в ответ , переопределить
touchesBegan
событие вместо крана жест:источник
TAGS # Swift2.0
Я черпаю вдохновение в ответе - превосходно - @ NAlexN и решаю написать себе обертку UILabel.
Я также попробовал TTTAttributedLabel, но не могу заставить его работать.
Надеюсь, вы сможете оценить этот код, любые предложения приветствуются!
источник
0
причину, котораяlocationOfTouchInTextContainer.x
была отрицательной. Я пытаюсь использоватьlet indexOfCharacter = layoutManager.glyphIndex(for: locationOfTouch, in: textContainer)
вместо этого, и работает хорошо.источник
Модифицированный код @timbroder для правильной обработки нескольких строк для swift4.2
Код UILabel
Код для распознавания Тэпа
источник
Это реализация Xamarin.iOS c #, основанная на ответе Кедара. .
Реализация MyClickableTextViewWithCustomUrlScheme с
ShouldInteractWithUrl
переопределением:Преобразованный код target-C в c # становится:
Убедитесь, что установлены Editable = false и Selectable = true, чтобы можно было нажать на ссылку.
Также ScrollEnabled = true позволяет textview корректно измерять его высоту.
источник