Могу ли я изменить цвет автоматически обнаруженных ссылок в UITextView?


115

У меня был инструмент, UITextViewкоторый обнаруживает номера телефонов и ссылки, но он отменяет мой fontColorи меняет его на blueColor. Есть ли способ отформатировать цвет автоматически обнаруженных ссылок, или я должен попробовать ручную версию этой функции?


Проверьте этот ответ, используя частное API-представление UIWebDocumentView: stackoverflow.com/a/11745983/111277
situee

Ответы:


170

В iOS 7 вы можете установить tintColorрасширение UITextView. Это влияет на цвет ссылки, а также на строку курсора и выбранный цвет текста.

iOS 7 также добавила новое свойство к UITextViewвызываемому, linkTextAttributesкоторое, по-видимому, позволит вам полностью контролировать стиль ссылки.


2
В этом ответе я дал дальнейшее объяснение: stackoverflow.com/a/21027340/1202222
Тим Виндзор Браун

В iOS 10.3 мне не удалось переопределить файл NSFontAttributeNamewith linkTextAttributes. Мне пришлось вручную указать шрифт в том же диапазоне, что и у меняNSLinkAttributeName
Heath Borders

37

Вместо использования UITextView я использовал UIWebView и включил «автоматическое обнаружение ссылок». Чтобы изменить цвет ссылки, просто создайте обычный CSS для тега.

Я использовал что-то вроде этого:

NSString * htmlString = [NSString stringWithFormat:@"<html><head><script> document.ontouchmove = function(event) { if (document.body.scrollHeight == document.body.clientHeight) event.preventDefault(); } </script><style type='text/css'>* { margin:0; padding:0; } p { color:black; font-family:Helvetica; font-size:14px; } a { color:#63B604; text-decoration:none; }</style></head><body><p>%@</p></body></html>", [update objectForKey:@"text"]];
webText.delegate = self;
[webText loadHTMLString:htmlString baseURL:nil];

13
Это кажется чрезвычайно хакерским для такой простой задачи.
yuikonnu 05

Я знаю ... но я не знаю более хакерского обходного пути. Apple действительно стоит подумать об этих мелких деталях.
Леандро Алвес

@Oscar ну, я думаю, это менее хакерский ответ, чем ответ Александера. По-прежнему сумасшедший, что нет простого свойства для такой фундаментальной функции.
Энди

1
вопрос касается текстового просмотра, а не веб-просмотра!
Борис Гафуров

полностью согласен с "asdasd". Веб-подход очень дорогой, они хотят видеть, сколько оперативной памяти он использует. для такой простой задачи используйте textview и свойства Apple.
ingconti

37

Вы можете использовать UIAppearanceпротокол для применения изменений для всех текстовых представлений:

Swift 4.x:

UITextView.appearance().linkTextAttributes = [ .foregroundColor: UIColor.red ]

Swift 3.x:

UITextView.appearance().linkTextAttributes = [ NSForegroundColorAttributeName: UIColor.red ]

Swift 2.x:

UITextView.appearance().linkTextAttributes = [ NSForegroundColorAttributeName: UIColor.redColor() ]

Objective-C:

[UITextView appearance].linkTextAttributes = @{ NSForegroundColorAttributeName : UIColor.redColor };

Внешний вид UITextViewне задокументирован, но работает хорошо.

Имейте в виду UIAppearanceпримечания:

iOS применяет изменения внешнего вида, когда представление входит в окно, но не меняет внешний вид представления, которое уже находится в окне. Чтобы изменить внешний вид представления, которое в данный момент находится в окне, удалите представление из иерархии представлений, а затем верните его обратно.

Другими слова: Вызов этого кода init(), или init(coder:)методы будут изменять внешний вид пользовательского интерфейса объекта, но вызов в loadView()или viewDidLoad()из ViewController не будет .
Если вы хотите установить внешний вид для всего приложения, application(_:didFinishLaunchingWithOptions:)это хорошее место для вызова такого кода.


Я предпочитаю этот вариант выбранному ответу, так как хочу использовать другой цвет для курсора / выделения текста и ссылок
Кевин Р.

Это лучший и актуальный ответ.
yuzer

Я использую UITextView и пишу код выше в viewdidload. но когда я пишу электронное письмо в текстовое поле и ввожу пробел, цвет не меняется.
Радж Аггравал, 02

18

Проблема с UITextView в linkTextAttributesтом, что он применяется ко всем автоматически обнаруживаемым ссылкам. Что, если вы хотите, чтобы разные ссылки имели разные атрибуты?

Оказывается, есть уловка: настроить ссылки как часть текста с атрибутами текстового представления и установить linkTextAttributesдля пустого словаря .

Вот пример в iOS 11 / Swift 4:

// mas is the mutable attributed string we are forming...
// ... and we're going to use as the text view's `attributedText`
mas.append(NSAttributedString(string: "LINK", attributes: [
    NSAttributedStringKey.link : URL(string: "https://www.apple.com")!,
    NSAttributedStringKey.foregroundColor : UIColor.green,
    NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue
]))
// ...
self.tv.attributedText = mas
// this is the important thing:
self.tv.linkTextAttributes = [:]

Моя строка - «Хотите изучить iOS?» Вам следует посетить лучший источник бесплатных руководств по iOS! Быстрая проверка hello google.com Атрибут 9826012345 Проверка строки в процессе ... "и атрибут ссылки по умолчанию требуется для веб-ссылки и номера мобильного телефона. Но я хочу сделать ссылку для строковой части" Хотите изучить iOS? "Другим цветом со ссылкой .. Значит, self.tv.linkTextAttributes = [:] работает только для настраиваемой ссылки.
БалКришан Ядав

14

Вы можете изменить цвет гиперссылки в TextView следующим образом:

В файле «Перо» вы можете перейти в окно «Свойства» и изменить оттенок на любой желаемый цвет.

или вы также можете сделать это программно, используя приведенный ниже код

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

Я действительно нашел другой способ без использования веб-просмотра, но имейте в виду, что он использует частный API и может быть отклонен в магазине приложений:

РЕДАКТИРОВАТЬ: мое приложение было одобрено Apple, хотя частное использование API!

Сначала объявите категорию в UITextView с помощью методов

- (id)contentAsHTMLString;
- (void)setContentToHTMLString:(id)arg1;

Они просто делают следующее:

- (id)contentAsHTMLString;
{
    return [super contentAsHTMLString];
}

- (void)setContentToHTMLString:(id)arg1;
{
    [super setContentToHTMLString:arg1];
}

Теперь напишем метод для красочных ссылок:

- (void) colorfillLinks;
{
    NSString *contentString = [self.textViewCustomText contentAsHTMLString];
    contentString = [contentString stringByReplacingOccurrencesOfString:@"x-apple-data-detectors=\"true\""
                                         withString:@"x-apple-data-detectors=\"true\" style=\"color:white;\""];
    [self.textViewCustomText setContentToHTMLString:contentString];
}

Он устанавливает атрибут стиля с определенным цветом для всех типов ссылок.

UITextView отображаются в Webiview, как и в div, поэтому вы можете пойти дальше и раскрасить каждый тип ссылки отдельно:

<div><a href="http://www.apple.com" x-apple-data-detectors="true" style="color:white;" x-apple-data-detectors-type="link" x-apple-data-detectors-result="0">http://www.apple.com</a></div>

Это x-apple-data-detectors-type="link"индикатор точного типа ссылки.

РЕДАКТИРОВАТЬ

На iOS7этом больше не работает. В iOS7 вы можете легко изменить цвет ссылки UITextViews, установив цвет оттенка. Вы не должны звонить

- (id)contentAsHTMLString;

больше, вы получите исключение. Вместо этого сделайте следующее, если вы хотите поддерживать iOS 7 и ниже:

- (void) colorfillLinks;
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.tintColor = [UIColor colorWithRed:79.0/255.0
                                     green:168.0/255.0
                                      blue:224.0/255.0
                                     alpha:1.0];
} else if(![self isFirstResponder ]) {
    NSString *contentString = [self contentAsHTMLString];
    contentString = [contentString stringByReplacingOccurrencesOfString:@"x-apple-data-detectors=\"true\""
                                                             withString:@"x-apple-data-detectors=\"true\" style=\"color:#DDDDDE;\""];
    [self setContentToHTMLString:contentString];

}
}


0

РЕДАКТИРОВАТЬ: не делайте этого UITextView, используйте UIWebViewвместо этого.

Для этого вам нужно создать таблицу стилей. Определите там класс с нужной вам цветовой комбинацией -

.headercopy {
 font-family: "Helvetica";
 font-size: 14px;
 line-height: 18px;
 font-weight:bold;
 color: #25526e;
}
a.headercopy:link {
 color:#ffffff;
 text-decoration:none;
}
a.headercopy:hover {
 color:#00759B;
 text-decoration:none;
}
a.headercopy:visited {
 color:#ffffff;
 text-decoration:none;
} 
a.headercopy:hover {
 color:#00759B;
 text-decoration:none;
}

теперь используйте класс 'headercopy' на своей html-странице, например:

<b>Fax:</b><a href="tel:646.200.7535" class="headercopy"> 646-200-7535</a><br />

это будет отображать номер телефона в нужном вам цвете с функцией щелчка.


использование веб-представлений - плохой стиль программирования для нативных приложений.
ingconti

0

Этот код устанавливает цвет номера телефона на I-Phone, но аннулирует ссылку автоматического вызова.

<div><a href="#" x-apple-data-detectors="true" style="color:white;" x-apple-data-detectors-type="link" x-apple-data-detectors-result="0">p&nbsp;&nbsp;0232 963 959</a></div>

0

Вот как я это сделал с помощью Swift 5:

let attributedString = NSMutableAttributedString(string: myTextView.text ?? "")
myTextView.linkTextAttributes = [NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.whiteColor] as [NSAttributedString.Key: Any]?
myTextView.attributedText = attributedString
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.