У меня был UITextView
, который обнаруживает номера телефонов и ссылки, но это переопределяет мой fontColor
и меняет его на blueColor
. Есть ли способ отформатировать цвет автоматически обнаруженных ссылок или я должен попробовать ручную версию этой функции?
Могу ли я изменить цвет автоматически обнаруженных ссылок в UITextView?
Ответ 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 0232 963 959</a></div>