Posso cambiare il colore dei collegamenti rilevati automaticamente su UITextView?


115

Avevo un UITextViewche rileva numeri di telefono e collegamenti, ma questo sostituisce il mio fontColore lo cambia in blueColor. Esiste un modo per formattare il colore dei collegamenti rilevati automaticamente o dovrei provare una versione manuale di questa funzione?


Controllare questa risposta utilizzando un privato-api visualizzazione secondaria UIWebDocumentView: stackoverflow.com/a/11745983/111277
SITUATA

Risposte:


170

Su iOS 7 puoi impostare tintColoril file UITextView. Influisce sul colore del collegamento, sulla linea del cursore e sul colore del testo selezionato.

iOS 7 ha anche aggiunto una nuova proprietà a UITextViewCall linkTextAttributesche sembrerebbe consentirti di controllare completamente lo stile del collegamento.


2
Ho fornito ulteriori spiegazioni in questa risposta: stackoverflow.com/a/21027340/1202222
Tim Windsor Brown

Su iOS 10.3, non ero in grado di sovrascrivere NSFontAttributeNamecon linkTextAttributes. Ho dovuto specificare manualmente il carattere nello stesso intervallo del mioNSLinkAttributeName
Heath Borders

37

Invece di utilizzare un UITextView, ho utilizzato un UIWebView e abilitato il "rilevamento automatico dei collegamenti". Per cambiare il colore del collegamento, è sufficiente creare un normale CSS per il tag.

Ho usato qualcosa del genere:

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

13
Questo sembra estremamente hacker per un compito così semplice.
yuikonnu

Lo so ... ma non conosco soluzioni alternative meno hacker. Apple dovrebbe davvero pensare a questi piccoli dettagli.
Leandro Alves

@Oscar beh, penso che sia meno hacker della risposta di Alexanders. Ancora pazzo che non ci sia una proprietà semplice per una funzionalità così fondamentale.
Andy

1
la domanda riguarda la visualizzazione del testo, non la visualizzazione sul Web!
Boris Gafurov

completamente d'accordo con "asdasd". L'approccio Web è molto costoso, per vedere quanta RAM usa. per un'attività così semplice usa la visualizzazione del testo e le proprietà fornite da Apple.
ingconti

37

È possibile utilizzare il UIAppearanceprotocollo per applicare le modifiche a tutte le visualizzazioni di testo:

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

L'aspetto per UITextViewnon è documentato, ma funziona bene.

Tieni a mente le UIAppearancenote:

iOS applica le modifiche all'aspetto quando una vista entra in una finestra, non cambia l'aspetto di una vista che è già in una finestra. Per modificare l'aspetto di una vista che si trova attualmente in una finestra, rimuovere la vista dalla gerarchia della vista e quindi rimetterla.

In altre parole: si chiama questo codice init(), o init(coder:)metodi saranno cambiare UI aspetto, ma chiama in loadView(), o viewDidLoad()di viewController non lo faranno .
Se si desidera impostare l'aspetto per l'intera applicazione, application(_:didFinishLaunchingWithOptions:)è un buon posto per chiamare tale codice.


Preferisco questo alla risposta selezionata, poiché desidero utilizzare un colore diverso per la selezione del cursore / testo e i collegamenti
Kevin R,

Questa è la risposta migliore e aggiornata.
yuzer

Ho usato un UITextView e ho scritto sopra il codice in viewdidload. ma quando scrivo e-mail nel campo di testo e inserisco lo spazio il colore non cambia.
Raj Aggrawal

18

Il problema con UITextView linkTextAttributesè che si applica a tutti i collegamenti rilevati automaticamente. E se desideri che link diversi abbiano attributi diversi?

Si scopre che c'è un trucco: configurare i collegamenti come parte del testo attribuito della vista di testo e impostare linkTextAttributesun dizionario vuoto .

Ecco un esempio in 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 = [:]

La mia stringa è "Vuoi imparare iOS?" Dovresti visitare la migliore fonte di tutorial iOS gratuiti! Controllo rapido ciao google.com Attribuito 9826012345 Test di stringa in corso ... "e l'attributo di collegamento predefinito è obbligatorio per il collegamento Web e il numero di cellulare. Ma desidero creare un collegamento per la parte di stringa" Vuoi imparare iOS? "In un colore diverso con link..Quindi self.tv.linkTextAttributes = [:] funziona solo per il collegamento personalizzato.
BalKrishan Yadav

14

È possibile modificare il colore del collegamento ipertestuale in un TextView nel modo seguente:

Nel file Pennino, puoi andare alla finestra Proprietà e cambiare la Tinta in qualsiasi colore desideri.

oppure puoi anche farlo in modo programmatico utilizzando il codice seguente

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

Ho trovato davvero un altro modo senza utilizzare una visualizzazione web, ma tieni presente che questa utilizza API private e potrebbe essere rifiutata in appstore:

EDIT: la mia app è stata approvata da Apple anche se l'uso privato di API!

Prima dichiara una categoria su UITextView con i metodi

- (id)contentAsHTMLString;
- (void)setContentToHTMLString:(id)arg1;

Stanno solo facendo quanto segue:

- (id)contentAsHTMLString;
{
    return [super contentAsHTMLString];
}

- (void)setContentToHTMLString:(id)arg1;
{
    [super setContentToHTMLString:arg1];
}

Ora scrivi un metodo per i link colorati:

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

Imposta l'attributo di stile con un colore specifico su tutti i tipi di collegamenti.

UITextViews è reso Webiview come tramite div in modo da poter anche andare oltre e colorare ciascun tipo di collegamento separatamente:

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

Il x-apple-data-detectors-type="link"è l'indicatore per il tipo esatto del collegamento

MODIFICARE

Su iOS7questo non funziona più. In iOS7 puoi facilmente cambiare il colore del collegamento di UITextViews impostando il colore della tinta. Non dovresti chiamare

- (id)contentAsHTMLString;

più, otterrai un'eccezione. Invece fai quanto segue se vuoi supportare iOS 7 e versioni precedenti:

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

}
}

3

Risposta rapida 5

Bello e semplice

myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]

0

EDIT: non farlo con UITextView, usa UIWebViewinvece.

Devi creare un foglio di stile per questo. Definisci una classe lì con la combinazione di colori di cui hai bisogno-

.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;
}

ora usa la classe 'headercopy' nella tua pagina html in questo modo-

<b>Fax:</b><a href="tel:646.200.7535" class="headercopy"> 646-200-7535</a><br />

questo visualizzerà il numero di telefono nel colore di cui hai bisogno con la funzionalità clic.


l'utilizzo delle visualizzazioni Web è un cattivo stile di programmazione per le app native.
ingconti

0

Questo codice imposterà il colore di un numero di telefono su un I-Phone ma annulla il collegamento alla chiamata automatica.

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

0

Ecco come l'ho fatto usando 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.