У меня был UITextView
, который обнаруживает номера телефонов и ссылки, но он переопределяет мой fontColor
и заменяет его на blueColor
. Есть ли способ отформатировать цвет автоматически обнаруженных ссылок, или мне следует попробовать ручную версию этой функции?
Могу ли я изменить цвет автоматически обнаруженных ссылок в UITextView?
Ответы (11)
В iOS 7 вы можете установить tintColor
из UITextView
. Он влияет на цвет ссылки, а также на линию курсора и цвет выделенного текста.
iOS 7 также добавила новое свойство UITextView
под названием linkTextAttributes
, которое, по-видимому, позволит вам полностью контролировать стиль ссылки.
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:)
- хорошее место для вызова такого кода.
Вместо использования 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];
Проблема с 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]];
Ответ Swift 5
Красиво и просто
myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
Я действительно нашел другой способ без использования веб-просмотра, но имейте в виду, что он использует частный 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];
}
}
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-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 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