Posso mudar a cor dos links detectados automaticamente no UITextView?

115

Eu tinha um UITextViewque detecta números de telefone e links, mas substitui o meu fontColore muda para blueColor. Existe uma maneira de formatar a cor dos links detectados automaticamente ou devo tentar uma versão manual desta função?

Leandro Alves
fonte
Marque esta resposta usando a-api privada subexibição UIWebDocumentView: stackoverflow.com/a/11745983/111277
Située

Respostas:

170

No iOS 7, você pode definir tintColoro 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 UITextViewchamado linkTextAttributesque parece permitir que você controle totalmente o estilo do link.

Stonemonk
fonte
2
Eu dei mais explicações nesta resposta: stackoverflow.com/a/21027340/1202222
Tim Windsor Brown
No iOS 10.3, não consegui substituir o NSFontAttributeNamecom linkTextAttributes. Tive que especificar manualmente a fonte no mesmo intervalo que meuNSLinkAttributeName
Heath Borders
37

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];
Leandro Alves
fonte
13
Isso parece extremamente hack para uma tarefa tão simples.
yuikonnu
Eu sei ... mas não conheço nenhuma solução alternativa menos hackeada. A Apple realmente deveria pensar sobre esses pequenos detalhes.
Leandro Alves
@Oscar bem, acho que é menos hackeado do que a resposta de Alexanders. Ainda louco que não existe uma propriedade simples para uma funcionalidade tão fundamental.
Andy
1
questão é sobre textview e não webview!
Boris Gafurov
concordo completamente com "asdasd". A abordagem da Web é muito cara, eles precisam ver quanta memória RAM é usada. para uma tarefa tão simples, use textview e as propriedades fornecidas pela Apple.
ingconti
37

Você pode usar o UIAppearanceprotocolo 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 UITextViewnão está documentada, mas funciona bem.

Tenha em mente as UIAppearancenotas:

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.

Grubas
fonte
Prefiro esta em vez da resposta selecionada, pois quero usar uma cor diferente para a seleção de cursor / texto e links
Kevin R
Esta é a melhor resposta e atualizada.
yuzer de
Eu usei um UITextView e escrevi o código acima em viewdidload. mas quando escrevo e-mail no campo de texto e entro no espaço, a cor não muda.
Raj Aggrawal
18

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 linkTextAttributespara 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 = [:]
mate
fonte
Minha string é "Quer aprender iOS?" Você deve visitar a melhor fonte de tutoriais gratuitos para iOS! Verificação rápida Olá google.com Atribuído 9826012345 Teste de string em andamento ... "e o atributo de link padrão é necessário para link da web e número de celular. Mas eu quero fazer um link para a parte de string" Quer aprender iOS? "Em cor diferente com link .. Então self.tv.linkTextAttributes = [:] está funcionando apenas para link personalizado.
BalKrishan Yadav
14

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]];
Manju
fonte
5

A tonalidade da cor também pode ser feita no storyboard

insira a descrição da imagem aqui

Ryan Heitner
fonte
3

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

}
}
Alexandre
fonte
3

Resposta Swift 5

Bom e simples

myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]
Mark Wilson
fonte
0

EDIT: Não faça isso com UITextView, use em UIWebViewvez 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.

Vaibhav Saran
fonte
usar visualizações da web é um estilo de programação ruim para aplicativos nativos.
ingconti
0

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&nbsp;&nbsp;0232 963 959</a></div>
Mark Overton
fonte
0

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
Jaytrixz
fonte