124 votes

Puis-je changer la couleur des liens détectés automatiquement dans UITextView ?

J'avais un UITextView qui détecte les numéros de téléphone et les liens, mais cela supplante mon fontColor et le changer en blueColor . Existe-t-il un moyen de formater la couleur des liens détectés automatiquement, ou dois-je essayer une version manuelle de cette fonction ?

0 votes

Vérifiez cette réponse en utilisant une sous-vue UIWebDocumentView de l'API privée : stackoverflow.com/a/11745983/111277

186voto

stonemonk Points 525

Sous iOS 7, vous pouvez définir le tintColor de la UITextView . Elle affecte la couleur du lien ainsi que la couleur de la ligne du curseur et du texte sélectionné.

iOS 7 a également ajouté une nouvelle propriété à UITextView appelé linkTextAttributes qui semble vous permettre de contrôler entièrement le style du lien.

2 votes

J'ai donné plus d'explications dans cette réponse : stackoverflow.com/a/21027340/1202222

1 votes

Sous iOS 10.3, je n'ai pas été en mesure de remplacer l'option NSFontAttributeName con linkTextAttributes . J'ai dû spécifier manuellement la police de caractères dans la même plage que mes NSLinkAttributeName

37voto

Leandro Alves Points 808

Au lieu d'utiliser un UITextView, j'ai utilisé un UIWebView et activé la fonction "détection automatique des liens". Pour changer la couleur du lien, il suffit de créer un CSS normal pour la balise.

J'ai utilisé quelque chose comme ça :

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

15 votes

Cela semble extrêmement pirate pour une tâche aussi simple.

0 votes

Je sais... mais je ne connais pas de solution de contournement moins pirate. Apple devrait vraiment penser à ces petits détails.

0 votes

@Oscar eh bien, je pense que c'est moins pirate que la réponse d'Alexanders. C'est quand même fou qu'il n'y ait pas de propriété simple pour une fonctionnalité aussi fondamentale.

15voto

Manju Points 1185

Vous pouvez modifier la couleur des hyperliens dans un TextView de la manière suivante :

Dans le fichier Nib, vous pouvez aller dans la fenêtre des propriétés et changer la teinte en la couleur de votre choix.

ou vous pouvez également le faire de manière programmatique en utilisant le code suivant

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];

0 votes

Joli ! Ça a bien marché pour moi.

3voto

Alexander Points 2514

J'ai en effet trouvé un autre moyen sans utiliser de webview mais gardez à l'esprit que cela utilise API privé et peut être rejeté dans l'appstore :

EDITAR: Mon application a été approuvée par Apple malgré l'utilisation de l'api privée !

Commencez par déclarer une catégorie sur UITextView avec les méthodes

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

Ils font simplement ce qui suit :

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

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

Maintenant, écrivez une méthode pour les liens colorés :

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

Il définit l'attribut de style avec une couleur spécifique sur tous les types de liens.

Les UITextViews sont rendus comme des Webiviews via des divs. Vous pouvez donc aller plus loin et colorer chaque type de lien séparément :

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

El x-apple-data-detectors-type="link" est l'indicateur du type exact de la liaison

EDITAR

Sur iOS7 cela ne fonctionne plus. Dans iOS7, vous pouviez facilement modifier la couleur des liens des UITextViews en définissant la couleur de la teinte. Vous ne devez pas appeler

- (id)contentAsHTMLString;

plus, vous obtiendrez une exception. Faites plutôt ce qui suit si vous voulez prendre en charge iOS 7 et inférieur :

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

}
}

0voto

Vaibhav Saran Points 4078

EDITAR: Ne le faites pas avec UITextView utiliser UIWebView à la place.

Vous devez créer une feuille de style pour cela. Définissez-y une classe avec la combinaison de couleurs dont vous avez besoin-

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

Maintenant, utilisez la classe 'headercopy' dans votre page html comme ceci-

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

cela affichera le numéro de téléphone dans la couleur que vous souhaitez avec la fonctionnalité de clic.

0 votes

L'utilisation de vues web est un mauvais style de programmation pour les applications natives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X