Posso alterar a cor dos links detectados automaticamente no UITextView?

Eu tinha um UITextView que detecta números de telefone e links, mas isso substitui o meu fontColor e alterá-lo para blueColor . Existe uma maneira de formatar a cor dos links detectados automaticamente ou devo tentar uma versão manual dessa function?

No iOS 7, você pode definir o tintColor do UITextView . Ela 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 chamada linkTextAttributes que parece permitir que você controle totalmente o estilo do link.

Em vez de usar um UITextView, usei um UIWebView e ativei os “links de detecção automática”. Para alterar a cor do link, criei um CSS regular para a tag.

Eu usei algo assim:

 NSString * htmlString = [NSString stringWithFormat:@"

%@

", [update objectForKey:@"text"]]; webText.delegate = self; [webText loadHTMLString:htmlString baseURL:nil];

Você pode usar o protocolo UIAppearance para aplicar alterações a todas as exibições de texto:

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() ] 

Objetivo-C:

 [UITextView appearance].linkTextAttributes = @{ NSForegroundColorAttributeName : UIColor.redColor }; 

Aparência para UITextView não está documentada, mas funciona bem.

Tenha em mente UIAppearance notas do UIAppearance :

O iOS aplica alterações de aparência quando uma visualização entra em uma janela, mas não altera a aparência de uma exibição que já está em uma janela. Para alterar a aparência de uma exibição que está atualmente em uma janela, remova a exibição da hierarquia de exibição e, em seguida, coloque-a de volta.

Em outras palavras: Chamar esse código nos methods init() ou init(coder:) mudará a aparência do Objeto UI, mas não será chamado em loadView() ou viewDidLoad() de viewController.
Se você deseja definir a aparência para o aplicativo inteiro, o application(_:didFinishLaunchingWithOptions:) é um bom local para chamar esse código.

Você pode alterar a cor do hiperlink em um TextView pelo seguinte:

No arquivo Nib, você pode ir para a janela Propriedades e alterar a tonalidade de cada cor desejada.

ou você também pode fazer isso programaticamente usando o código abaixo

 [YOURTEXTVIEW setTintColor:[UIColor whiteColor]]; 

Eu encontrei de fato uma outra maneira sem usar um webview, mas lembre-se de que isso usa API privada e pode ser rejeitado no appstore:

EDIT: Meu aplicativo foi aprovado pela apple embora o uso da API privada!

Primeiro declare uma categoria no UITextView com os methods

 - (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 style com uma cor específica em todos os tipos de links.

UITextViews são renderizados como Webiview via divs, então você pode ir além e colorir cada tipo de link separadamente:

  

O x-apple-data-detectors-type="link" é o indicador para o tipo exato do link

EDITAR

No iOS7 isso não está mais funcionando. No iOS7, você pode alterar facilmente a cor do link do UITextViews, definindo a cor da tonalidade. Você não deve ligar

 - (id)contentAsHTMLString; 

mais, você receberá uma exceção. Em vez disso, faça o seguinte se quiser oferecer suporte ao iOS 7 e abaixo:

 - (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]; } } 

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

insira a descrição da imagem aqui

O problema com o 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: configurar os links como parte do texto atribuído da visão de texto e definir o linkTextAttributes como um dictionary 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 = [:] 

EDIT: Não faça isso com o UITextView , use o UIWebView .

Você precisa fazer uma folha de estilo para isso. Defina uma class lá com a combinação de colors 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 class ‘headercopy’ em sua página html como esta-

 Fax: 646-200-7535

Isso exibirá o número de telefone na cor que você precisa com a funcionalidade de clique.

Este código irá definir a cor de um número de telefone em um I-Phone, mas anula o link de chamada automática.