Сделать гиперссылки кликабельными в UITextView
. Вы просто устанавливаете флажок «обнаруживать ссылки» в представлении в IB, и он обнаруживает ссылки HTTP и превращает их в гиперссылки.
Тем не менее, это все еще означает, что то, что видит пользователь, является «сырой» ссылкой. RTF-файлы и HTML позволяют настроить читаемую пользователем строку со ссылкой «позади».
Атрибутивный текст легко установить в текстовом представлении (или, UILabel
или UITextField
, если на то пошло). Однако, когда этот атрибутивный текст содержит ссылку, он не кликабелен.
Есть ли способ , чтобы сделать пользовательский читаемый текст кликабельным в UITextView
, UILabel
или UITextField
?
Разметка отличается от SO, но вот общая идея. То, что я хочу, это текст, как это:
Этот морф был создан с помощью Face Dancer. Нажмите, чтобы просмотреть в магазине приложений.
Единственное, что я могу получить, это:
Этот морф был создан с помощью Face Dancer. Нажмите на http://example.com/facedancer для просмотра в магазине приложений.
Ответы:
Используйте NSMutableAttributedString .
Редактировать :
Речь идет не о самом вопросе, а только о том, чтобы уточнить,
UITextField
иUILabel
не поддерживает открытие URL. Если вы хотите использоватьUILabel
со ссылками, вы можете проверить TTTAttributedLabel .Кроме того, вы должны установить
dataDetectorTypes
ценность вашихUITextView
кUIDataDetectorTypeLink
илиUIDataDetectorTypeAll
в открытых URL - адресов при нажатии. Или вы можете использовать метод делегата, как предложено в комментариях.источник
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
NSURL
. ----[str addAttribute: NSLinkAttributeName value: [NSURL URLWithString:@"http://www.google.com"] range: NSMakeRange(0, str.length)];
NSAttributedString.h
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0); // NSURL (preferred) or NSString
Я нашел это действительно полезным, но мне нужно было сделать это в нескольких местах, поэтому я обернул свой подход в простое расширение
NSMutableAttributedString
:Свифт 3
Swift 2
Пример использования:
Objective-C
Я только что выполнил требование сделать то же самое в чистом проекте Objective-C, так что вот категория Objective-C.
Пример использования:
Удостоверьтесь, что атрибут Поведения NSTextField установлен как Выбираемый.
источник
Я только что создал подкласс UILabel специально для таких случаев использования. Вы можете легко добавить несколько ссылок и определить для них разные обработчики. Также поддерживается выделение нажатой ссылки при касании для обратной связи. Пожалуйста, обратитесь к https://github.com/null09264/FRHyperLabel .
В вашем случае код может выглядеть так:
Образец скриншота (в этом случае обработчик настроен на выдачу предупреждения вместо открытия URL)
источник
- (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler;
вместо этого. Пожалуйста, обратитесь к readme на странице GitHub.Незначительное улучшение решения ujell: если вы используете NSURL вместо NSString, вы можете использовать любой URL (например, пользовательские URL)
Радоваться, веселиться!
источник
Свифт 4:
Swift 3.1:
источник
У меня тоже было подобное требование, сначала я использовал UILabel, а потом понял, что UITextView лучше. Я заставил UITextView вести себя как UILabel, отключив взаимодействие и прокрутку, и создал метод категории для
NSMutableAttributedString
установки ссылки на текст, такой же, как у Карла (+1 за это), это моя версия obj cВы можете использовать делегат ниже, чтобы обработать действие
источник
NSForegroundColorAttributeName
в диапазоне, гдеNSLinkAttributeName
применяется, не работает. Независимо от того,linkTextAttributes
чтоUITextView
применяются вместо. УNSForegroundColorAttributeName
тебя работает?linkTextAttributes
на то же самое? или возможноtintColor
? Можете ли вы сделать так, чтобы 2 ссылки отображались разными цветами в одном и том же текстовом представлении?Используйте UITextView, он поддерживает интерактивные ссылки. Создайте приписанную строку, используя следующий код
Затем установите текст UITextView следующим образом
Убедитесь, что вы включили «Выбираемое» поведение UITextView в XIB.
источник
Selectable
важно!Суть моего вопроса заключалась в том, что я хотел иметь возможность создавать кликабельные ссылки в текстовых представлениях / полях / метках без необходимости писать собственный код для манипулирования текстом и добавления ссылок. Я хотел, чтобы это управлялось данными.
Я наконец понял, как это сделать. Проблема в том, что IB не соблюдает встроенные ссылки.
Кроме того, версия для iOS
NSAttributedString
не позволяет инициализировать приписанную строку из файла RTF. Версия OS X изNSAttributedString
действительно есть инициализатор , который принимает файл в формате RTF в качестве входных данных.NSAttributedString
соответствует протоколу NSCoding, поэтому вы можете преобразовать его в / из NSDataЯ создал инструмент командной строки OS X, который принимает файл RTF в качестве входных данных и выводит файл с расширением .data, который содержит NSData из NSCoding. Затем я помещаю файл .data в свой проект и добавляю пару строк кода, который загружает текст в представление. Код выглядит так (этот проект был в Swift):
Для приложений, которые используют много форматированного текста, я создаю правило сборки, которое сообщает Xcode, что все файлы .rtf в данной папке являются исходными, а файлы .data - выходными. После этого я просто добавляю файлы .rtf в назначенный каталог (или редактирую существующие файлы), и процесс сборки выясняет, что они новые / обновленные, запускает инструмент командной строки и копирует файлы в комплект приложения. Работает красиво.
Я написал сообщение в блоге, которое ссылается на пример (Swift) проекта, демонстрирующего эту технику. Вы можете видеть это здесь:
Создание интерактивных URL-адресов в UITextField, которые открываются в вашем приложении
источник
Пример Swift 3 для обнаружения действий при атрибуции текстовых нажатий
https://stackoverflow.com/a/44226491/5516830
Также вы можете добавить любое действие, которое хотите, с
shouldInteractWith URL
помощью метода UITextFieldDelegate.Ура !!
источник
Быстрый ответ - использование UITextView вместо UILabel. Вам нужно включить
Selectable
и отключитьEditable
.Затем отключите индикаторы прокрутки и отскоки.
Мое решение с использованием
NSMutableAttributedString
строки HTMLNSHTMLTextDocumentType
источник
NSAttributedString
, установить в качествеattributedText
моегоUITextView
и гиперссылки просто работают! Было бы много работы, чтобы найти диапазон каждой гиперссылки и настроить ее с помощью атрибутов.Я написал метод, который добавляет ссылку (linkString) к строке (fullString) с определенным URL (urlString):
Вы должны назвать это так:
источник
Мне нужно было продолжать использовать чистый UILabel, так называемый это из моего распознавателя касаний (это основано на ответе malex здесь: Индекс символов в точке касания для UILabel )
источник
Обновить:
На мой вопрос было 2 ключевых части:
Оказывается, в iOS 7 добавлена возможность загрузки атрибутивного текста из
NSData
.Я создал собственный подкласс,
UITextView
который использует@IBInspectable
атрибут и позволяет загружать содержимое из файла RTF непосредственно в IB. Вы просто вводите имя файла в IB, а пользовательский класс делает все остальное.Вот подробности:
В iOS 7
NSAttributedString
получил методinitWithData:options:documentAttributes:error:
. Этот метод позволяет загрузить NSAttributedString из объекта NSData. Вы можете сначала загрузить файл RTF в NSData, а затем использоватьinitWithData:options:documentAttributes:error:
для загрузки этих NSData в ваше текстовое представление. (Обратите внимание, что есть также метод,initWithFileURL:options:documentAttributes:error:
который будет загружать атрибутированную строку непосредственно из файла, но этот метод устарел в iOS 9. Безопаснее использовать методinitWithData:options:documentAttributes:error:
, который не устарел.Я хотел метод, который позволял бы мне устанавливать кликабельные ссылки в моих текстовых представлениях без необходимости создавать какой-либо код, специфичный для ссылок, которые я использовал.
Решение, которое я придумал, состояло в том, чтобы создать собственный подкласс UITextView, который я вызываю,
RTF_UITextView
и присвоить ему@IBInspectable
свойство с именемRTF_Filename
. Добавление@IBInspectable
атрибута к свойству заставляет Интерфейсный Разработчик выставить это свойство в «Инспекторе Атрибутов». Затем вы можете установить это значение из IB без специального кода.Я также добавил
@IBDesignable
атрибут в свой пользовательский класс.@IBDesignable
Атрибут сообщает Xcode , что он должен установить запущенную копию пользовательского класса представления в строитель интерфейс , так что вы можете увидеть его в графическом дисплее вашего зрения иерархии. () К сожалению, для этого класса@IBDesignable
свойство выглядит нечетким. Это сработало, когда я впервые добавил его, но затем я удалил текстовое содержимое моего текстового представления, и кликабельные ссылки в моем представлении исчезли, и я не смог их вернуть.)Код для моего
RTF_UITextView
очень прост. Помимо добавления@IBDesignable
атрибута иRTF_Filename
свойства с@IBInspectable
атрибутом, я добавилdidSet()
метод кRTF_Filename
свойству.didSet()
Метод вызывается каждый раз , когда значениеRTF_Filename
свойства изменяется. Код дляdidSet()
метода довольно прост:Обратите внимание, что если свойство @IBDesignable не позволяет надежно предварительно просматривать стилизованный текст в Интерфейсном конструкторе, то может быть лучше установить приведенный выше код как расширение UITextView, а не как пользовательский подкласс. Таким образом, вы можете использовать его в любом текстовом представлении, не меняя текстовое представление на пользовательский класс.
Смотрите мой другой ответ, если вам нужно поддерживать версии iOS до iOS 7.
Вы можете скачать пример проекта, который включает этот новый класс, из gitHub:
Демонстрационный проект DatesInSwift на Github
источник
Просто найдите решение без кода для UITextView:
Включите Обнаружение-> Параметры ссылок, URL, а также адрес электронной почты будут обнаружены и кликабельны!
источник
Swift версия:
источник
Используйте UITextView и установите dataDetectorTypes для Link.
как это:
Если вы хотите определить ссылку, номер телефона, адрес и т. Д. Затем
источник
http://somedomain/someurl?param=value
Быстрое добавление к оригинальному описанию Дункана С в отношении поведения IB. Он пишет: «Сделать гиперссылки кликабельными в UITextView довольно просто. Вы просто устанавливаете флажок« обнаруживать ссылки »в представлении в IB, и он обнаруживает ссылки http и превращает их в гиперссылки».
Мой опыт (по крайней мере, в xcode 7) заключается в том, что вам также нужно отключить поведение «Редактируемый», чтобы URL-адреса были обнаружены и кликабельны.
источник
Если у вас возникли проблемы с тем, что @Karl Nosworthy и @esilver предоставили выше, я обновил расширение NSMutableAttributedString до его версии Swift 4.
источник
Отличная библиотека от @AliSoftware
OHAttributedStringAdditions
позволяет легко добавлять ссылки,UILabel
вот документация: https://github.com/AliSoftware/OHAttributedStringAdditions/wiki/link-in-UILabelисточник
Если вы хотите использовать NSLinkAttributeName в UITextView, то вы можете рассмотреть возможность использования библиотеки AttributedTextView. Это подкласс UITextView, который очень легко справляется с ними. Для получения дополнительной информации см .: https://github.com/evermeer/AttributedTextView
Вы можете заставить любую часть текста взаимодействовать следующим образом (где textView1 - это UITextView IBoutlet):
А для обработки хэштегов и упоминаний вы можете использовать такой код:
источник
если вы хотите активную подстроку в вашем UITextView, то вы можете использовать мой расширенный TextView ... он короткий и простой. Вы можете редактировать его, как хотите.
результат:
код: https://github.com/marekmand/ActiveSubstringTextView
источник
КЛЮЧЕВЫЕ МОМЕНТЫ:
источник