Чи можна змінити колір автоматично виявлених посилань на UITextView?


115

У мене було UITextViewте, що виявляє телефонні номери та посилання, але це переосмислює мою fontColorта змінює їх на blueColor. Чи є спосіб відформатувати колір автоматично виявлених посилань чи слід спробувати вручну версію цієї функції?


Перевірте цей відповідь з допомогою приватного апі підвид UIWebDocumentView: stackoverflow.com/a/11745983/111277
situee

Відповіді:


170

КСН 7 ви можете встановити tintColorз UITextView. Він впливає на колір посилання, а також на рядок курсору та вибраний колір тексту.

iOS 7 також додав нову властивість до UITextViewвиклику, linkTextAttributesяка, як видається, дозволить вам повністю контролювати стиль посилання.


2
Я дав додаткові пояснення у цій відповіді: stackoverflow.com/a/21027340/1202222
Тім Віндзор Браун

КСН 10.3, я не зміг перевизначити NSFontAttributeNameз 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

Я знаю ... але я не знаю жодного вирішення менш хакі. Apple справді повинна подумати над цими дрібницями.
Леандро Алвеш

@Oscar добре, я думаю, що це менш хакітно, ніж відповідають Олександри. Ще божевільно, що для такої основної функціональності немає простої властивості.
Енді

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

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

37

Ви можете використовувати UIAppearanceпротокол, щоб застосувати зміни до всіх переглядів тексту:

Швидкий 4.x:

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

Швидкий 3.x:

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

Швидкий 2.x:

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

Завдання-C:

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

Зовнішній вигляд UITextViewне задокументований, але працює добре.

Майте на увазі UIAppearanceпримітки:

iOS застосовує зміни зовнішнього вигляду, коли погляд переходить у вікно, він не змінює зовнішній вигляд представлення, яке вже є у вікні. Щоб змінити вигляд перегляду, який зараз знаходиться у вікні, видаліть подання з ієрархії перегляду, а потім поверніть його назад.

Іншими слова: Виклик цього коду init(), або init(coder:)методи будуть змінювати зовнішній вигляд призначеного для користувача інтерфейсу об'єкта, але виклик в loadView()або viewDidLoad()з ViewController НЕ буде .
Якщо ви хочете встановити зовнішній вигляд для всієї програми, application(_:didFinishLaunchingWithOptions:)це хороше місце для виклику такого коду.


Я віддаю перевагу цьому над обраною відповіддю, оскільки хочу використовувати інший колір для вибору курсору / тексту та посилань
Кевін R

Це найкраща і сучасна відповідь.
Юзер

Я використовую код UITextView і пишу над кодом у viewdidload. але коли я пишу електронну пошту в текстовому полі та вводимо пробіл, колір не змінюється.
Raj Aggrawal

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! Швидка перевірка привіт google.com Attributed 9826012345 String testing in going ... "та атрибут посилань за замовчуванням необхідний для веб-посилання та мобільного номера. Але я хочу зробити посилання для рядкової частини" Хочеш вивчити iOS? "В іншому кольорі with link..So self.tv.linkTextAttributes = [:] працює лише для користувацького посилання.
BalKrishan Yadav

14

Ви можете змінити колір гіперпосилання в TextView таким чином:

У файлі Nib ви можете перейти до вікна властивостей і змінити відтінок, на який ви хочете будь-який колір.

або ви також можете це робити програмно, використовуючи наведений нижче код

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

Я дійсно знайшов інший спосіб без використання веб-перегляду, але майте на увазі, що для цього використовується приватний 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 як через divs, щоб ви могли навіть піти далі та розфарбувати кожен тип посилання окремо:

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

}
}


0

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

це відобразить номер телефону у потрібному вам кольорі за допомогою функцій клацання.


використання веб-переглядів - це поганий стиль програмування для нативних програм.
ingconti

0

Цей код визначає колір телефонного номера на I-телефоні, але анулює автоматичне посилання на дзвінки.

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