У мене було UITextView
те, що виявляє телефонні номери та посилання, але це переосмислює мою fontColor
та змінює їх на blueColor
. Чи є спосіб відформатувати колір автоматично виявлених посилань чи слід спробувати вручну версію цієї функції?
У мене було UITextView
те, що виявляє телефонні номери та посилання, але це переосмислює мою fontColor
та змінює їх на blueColor
. Чи є спосіб відформатувати колір автоматично виявлених посилань чи слід спробувати вручну версію цієї функції?
Відповіді:
КСН 7 ви можете встановити tintColor
з UITextView
. Він впливає на колір посилання, а також на рядок курсору та вибраний колір тексту.
iOS 7 також додав нову властивість до UITextView
виклику, linkTextAttributes
яка, як видається, дозволить вам повністю контролювати стиль посилання.
NSFontAttributeName
з linkTextAttributes
. Мені довелося вручну вказати шрифт у тому ж діапазоні, що і мійNSLinkAttributeName
Замість використання 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];
Ви можете використовувати 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:)
це хороше місце для виклику такого коду.
Проблема з 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 = [:]
Ви можете змінити колір гіперпосилання в TextView таким чином:
У файлі Nib ви можете перейти до вікна властивостей і змінити відтінок, на який ви хочете будь-який колір.
або ви також можете це робити програмно, використовуючи наведений нижче код
[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
Я дійсно знайшов інший спосіб без використання веб-перегляду, але майте на увазі, що для цього використовується приватний 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];
}
}
Швидкий 5 відповідь
Приємно і просто
myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
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 />
це відобразить номер телефону у потрібному вам кольорі за допомогою функцій клацання.
Цей код визначає колір телефонного номера на 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 0232 963 959</a></div>
Ось як я це зробив за допомогою 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