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

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

Ответы [ 9 ]

154 голосов
/ 27 сентября 2013

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

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

40 голосов
/ 16 марта 2010

Вместо использования 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];
30 голосов
/ 25 апреля 2016

Вы можете использовать протокол 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:) является хорошим местом для вызова такого кода.

11 голосов
/ 08 ноября 2013

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

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

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

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
10 голосов
/ 03 октября 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 = [:]
4 голосов
/ 15 апреля 2018

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

enter image description here

3 голосов
/ 25 июня 2013

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

РЕДАКТИРОВАТЬ: Мое приложение было одобрено 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" - индикатор точного типа ссылки

EDIT

На 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];

}
}
1 голос
/ 23 октября 2010

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 />

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

0 голосов
/ 29 июня 2015

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