Eu tinha um UITextView
que detecta números de telefone e links, mas substitui o meu fontColor
e muda para blueColor
. Existe uma maneira de formatar a cor dos links detectados automaticamente ou devo tentar uma versão manual desta função?
Eu tinha um UITextView
que detecta números de telefone e links, mas substitui o meu fontColor
e muda para blueColor
. Existe uma maneira de formatar a cor dos links detectados automaticamente ou devo tentar uma versão manual desta função?
Respostas:
No iOS 7, você pode definir tintColor
o UITextView
. Isso afeta a cor do link, bem como a linha do cursor e a cor do texto selecionado.
O iOS 7 também adicionou uma nova propriedade ao UITextView
chamado linkTextAttributes
que parece permitir que você controle totalmente o estilo do link.
NSFontAttributeName
com linkTextAttributes
. Tive que especificar manualmente a fonte no mesmo intervalo que meuNSLinkAttributeName
Em vez de usar um UITextView, usei um UIWebView e habilitei os "links de detecção automática". Para mudar a cor do link, basta criar um CSS regular para a tag.
Eu usei algo assim:
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];
Você pode usar o UIAppearance
protocolo para aplicar alterações em todas as visualizações de texto:
Swift 4.x:
UITextView.appearance().linkTextAttributes = [ .foregroundColor: 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 };
A aparência de UITextView
não está documentada, mas funciona bem.
Tenha em mente as UIAppearance
notas:
O iOS aplica mudanças de aparência quando uma visualização entra em uma janela, ele não muda a aparência de uma visualização que já está em uma janela. Para alterar a aparência de uma visualização que está atualmente em uma janela, remova a visualização da hierarquia de visualizações e coloque-a de volta.
Em outras palavras: chamar esse código em init()
, ou init(coder:)
métodos irá mudar a aparência de objetos de interface do usuário, mas chamando loadView()
, ou viewDidLoad()
de viewController não vai .
Se você deseja definir a aparência de todo o aplicativo, application(_:didFinishLaunchingWithOptions:)
é um bom lugar para chamar esse código.
O problema com UITextView linkTextAttributes
é que ele se aplica a todos os links detectados automaticamente. E se você quiser que links diferentes tenham atributos diferentes?
Acontece que há um truque: configure os links como parte do texto atribuído da visualização de texto e defina o linkTextAttributes
para um dicionário vazio .
Aqui está um exemplo no 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 = [:]
Você pode alterar a cor do hiperlink em um TextView da seguinte maneira:
No arquivo Nib, você pode ir para a janela Propriedades e alterar a tonalidade para a cor que desejar.
ou você também pode fazer isso programaticamente usando o código abaixo
[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
Na verdade, encontrei outra maneira sem usar um webview, mas tenha em mente que isso usa API privada e pode ser rejeitado no appstore:
EDITAR: Meu aplicativo foi aprovado pela apple, embora o uso de API privada!
Primeiro declare uma categoria em UITextView com os métodos
- (id)contentAsHTMLString;
- (void)setContentToHTMLString:(id)arg1;
Eles estão apenas fazendo o seguinte:
- (id)contentAsHTMLString;
{
return [super contentAsHTMLString];
}
- (void)setContentToHTMLString:(id)arg1;
{
[super setContentToHTMLString:arg1];
}
Agora escreva um método para links coloridos:
- (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];
}
Ele define o atributo de estilo com uma cor específica em todos os tipos de links.
UITextViews são renderizados Webiview como via divs para que você possa ir ainda mais longe e colorir cada tipo de link separadamente:
<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>
O x-apple-data-detectors-type="link"
é o indicador para o tipo exato de link
EDITAR
Sobre iOS7
isso não está mais funcionando. No iOS7, você pode facilmente alterar a cor do link de UITextViews definindo a cor da tonalidade. Você não deve ligar
- (id)contentAsHTMLString;
mais, você terá uma exceção. Em vez disso, faça o seguinte se quiser oferecer suporte ao iOS 7 e inferior:
- (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];
}
}
Resposta Swift 5
Bom e simples
myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
EDIT:
Não faça isso com UITextView
, use em UIWebView
vez disso.
Você precisa fazer uma folha de estilo para isso. Defina uma classe lá com a combinação de cores que você precisa-
.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;
}
agora use a classe 'headercopy' em sua página html como esta-
<b>Fax:</b><a href="tel:646.200.7535" class="headercopy"> 646-200-7535</a><br />
isso exibirá o número de telefone na cor necessária com a funcionalidade de clique.
Este código definirá a cor de um número de telefone em um I-Phone, mas anula o link de chamada automática.
<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>
Foi assim que fiz usando o 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