Posso cambiare il colore dei collegamenti rilevati automaticamente su UITextView?

Ho avuto un UITextView che rileva numeri di telefono e collegamenti, ma questo sostituisce il mio fontColor e lo cambia in blueColor . C’è un modo per formattare il colore dei collegamenti rilevati automaticamente, o dovrei provare una versione manuale di questa funzione?

Su iOS 7 puoi impostare tintColor di 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 UITextView chiamata linkTextAttributes che sembrerebbe consentirvi di controllare completamente lo stile del collegamento.

Invece di usare un UITextView, ho usato un UIWebView e abilitato i “link auto-detect”. Per cambiare il colore del link, hai appena creato un normale CSS per il tag.

Ho usato qualcosa del genere:

 NSString * htmlString = [NSString stringWithFormat:@"

%@

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

È ansible utilizzare il protocollo UIAppearance per applicare le modifiche a tutte le visualizzazioni di testo:

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

L’aspetto di UITextView non è documentato, ma funziona bene.

Tieni presente UIAppearance note di UIAppearance :

iOS applica modifiche all’aspetto quando una vista entra in una finestra, non modifica l’aspetto di una vista già presente 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 reinserirla.

In altre parole: la chiamata di questo codice in init() , o init(coder:) metodi init(coder:) cambieranno l’aspetto dell’object UI, ma la chiamata a loadView() o viewDidLoad() di viewController non lo farà .
Se si desidera impostare l’aspetto per l’intera applicazione, l’ application(_:didFinishLaunchingWithOptions:) è un buon posto per chiamare tale codice.

È ansible modificare il colore del collegamento ipertestuale in una vista testo come segue:

Nel file Nib, puoi andare alla finestra delle proprietà e cambiare la tinta a cui vuoi sempre il colore.

oppure puoi farlo anche programmaticamente usando il codice qui sotto

 [YOURTEXTVIEW setTintColor:[UIColor whiteColor]]; 

Ho trovato davvero un altro modo senza utilizzare una webview, ma tieni presente che questa utilizza l’API privata e potrebbe essere rifiutata nell’appstore:

EDIT: la mia app è stata approvata da Apple anche se l’uso delle API private!

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 style con un colore specifico su tutti i tipi di link.

Le visualizzazioni UIText vengono visualizzate come visualizzazioni Web tramite div in modo da poter andare oltre e colorare ogni tipo di collegamento separatamente:

  

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

MODIFICARE

Su iOS7 questo non funziona più. In iOS7 è ansible modificare facilmente il colore del collegamento di UITextViews impostando il colore della tinta. Non dovresti chiamare

 - (id)contentAsHTMLString; 

più, avrai un’eccezione. Invece fai quanto segue se vuoi supportare iOS 7 e seguenti:

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

Il colore della tinta può essere fatto anche nello storyboard

inserisci la descrizione dell'immagine qui

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

Si scopre che c’è un trucco: configurare i collegamenti come parte del testo attribuito dalla vista testuale e impostare il linkTextAttributes su un 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 = [:] 

EDIT: non farlo con UITextView , utilizzare invece UIWebView .

È necessario creare un foglio di stile per questo. Definisci una class lì con la combinazione di colors 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 class ‘headercopy’ nella tua pagina html come questa-

 Fax: 646-200-7535

questo mostrerà il numero di telefono nel colore che ti serve con la funzionalità click.

Questo codice imposta il colore di un numero di telefono su un I-Phone ma interrompe il collegamento alla chiamata automatica.