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

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


person Leandro Alves    schedule 29.08.2009    source источник
comment
Проверьте этот ответ, используя подвид частного API UIWebDocumentView: stackoverflow.com/a/11745983/111277   -  person situee    schedule 27.01.2014


Ответы (11)


В iOS 7 вы можете установить tintColor из UITextView. Он влияет на цвет ссылки, а также на линию курсора и цвет выделенного текста.

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

person stonemonk    schedule 27.09.2013
comment
В этом ответе я дал дополнительные пояснения: stackoverflow.com/a/21027340/1202222 - person Tim Windsor Brown; 10.12.2014
comment
В iOS 10.3 мне не удалось переопределить NSFontAttributeName с помощью linkTextAttributes. Мне пришлось вручную указать шрифт в том же диапазоне, что и мой NSLinkAttributeName - person Heath Borders; 19.10.2017

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

Свифт 4.x:

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

Свифт 3.x:

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

Свифт 2.х:

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

Цель-C:

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

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

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

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

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

person Grubas    schedule 25.04.2016
comment
Я предпочитаю этот вариант выбранному ответу, так как хочу использовать другой цвет для выделения курсора/текста и ссылок. - person Kevin R; 08.06.2016
comment
Это лучший и актуальный ответ. - person yuzer; 12.06.2016
comment
Я использую UITextView и пишу код выше в viewdidload. но когда я пишу электронную почту в текстовом поле и ввожу пробел, цвет не меняется. - person Raj Aggrawal; 02.08.2016

Вместо использования 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];
person Leandro Alves    schedule 15.03.2010
comment
Это кажется чрезвычайно хакерским для такой простой задачи. - person yuikonnu; 05.06.2013
comment
Я знаю... но я не знаю менее хакерского обходного пути. Apple действительно следует подумать об этих маленьких деталях. - person Leandro Alves; 07.06.2013
comment
@Оскар, ну, я думаю, это менее хакерский ответ, чем ответ Александра. Все еще безумно, что нет простого свойства для такой фундаментальной функциональности. - person Andy; 29.08.2013
comment
вопрос о текстовом просмотре, а не о веб-просмотре! - person Boris Gafurov; 17.10.2013
comment
полностью согласен с asdasd. Веб-подход очень дорогой, они хотят посмотреть, сколько оперативной памяти он использует. для такой простой задачи используйте textview и свойства, которые дает Apple. - person ingconti; 30.05.2017

Проблема с 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 = [:]
person matt    schedule 03.10.2017
comment
Моя строка: Хотите изучить iOS? Вам следует посетить лучший источник бесплатных руководств по iOS! Быстрая проверка привет google.com Атрибут 9826012345 Проверка строки в процессе... и атрибут ссылки по умолчанию требуется для Интернета ссылка и номер моб. Но я хочу сделать ссылку для строковой части Хотите изучить iOS? другим цветом со ссылкой. Итак, self.tv.linkTextAttributes = [:] работает только для пользовательской ссылки. - person BalKrishan Yadav; 10.01.2018

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

В файле Nib вы можете перейти в окно свойств и изменить оттенок на любой цвет, который вы хотите.

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

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
person Manju    schedule 08.11.2013
comment
Хороший! хорошо работал для меня. - person jegadeesh; 08.02.2021

Ответ Swift 5

Красиво и просто

myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
person Mark Wilson    schedule 06.12.2019

Цвет оттенка также можно сделать в раскадровке.

введите описание изображения здесь

person Ryan Heitner    schedule 15.04.2018

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

EDIT: Мое приложение было одобрено 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];
}

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

UITextViews визуализируются как 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];

}
}
person Alexander    schedule 25.06.2013

EDIT: не делайте этого с 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 />

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

person Vaibhav Saran    schedule 23.10.2010
comment
использование веб-представлений — плохой стиль программирования для нативных приложений. - person ingconti; 30.05.2017

Этот код установит цвет телефонного номера на 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>
person Mark Overton    schedule 29.06.2015

Вот как я это сделал с помощью 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
person jaytrixz    schedule 02.12.2019