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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Swift 4.x:

UITextView.appearance().linkTextAttributes = [ NSAttributedStringKey.foregroundColor.rawValue: 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:) является хорошим местом для вызова такого кода.

Ответ 4

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

В файле Nib вы можете перейти в окно "Свойства" и изменить оттенок, к которому требуется когда-либо цвет.

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

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];

Ответ 5

Я действительно нашел другой способ без использования webview, но имейте в виду, что это использует частный 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];
}

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

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

}
}

Ответ 6

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

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

Ответ 7

Проблема с 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 `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 = [:]

Ответ 8

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