web-dev-qa-db-fra.com

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

J'avais un UITextView qui détecte les numéros de téléphone et les liens, mais cela remplace mon fontColor et le change 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?

110
Leandro Alves

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

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

156
stonemonk

Au lieu d'utiliser un UITextView, j'ai utilisé un UIWebView et activé les "liens de détection automatique". Pour changer la couleur du lien, il suffit de créer un CSS régulier 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];
40
Leandro Alves

Vous pouvez utiliser le protocole UIAppearance pour appliquer des modifications à toutes les vues de texte:

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

Objectif c:

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

L'apparence de UITextView n'est pas documentée, mais fonctionne bien.

Gardez à l'esprit UIAppearance notes:

iOS applique des changements d'apparence lorsqu'une vue entre dans une fenêtre, il ne change pas l'apparence d'une vue qui est déjà dans une fenêtre. Pour modifier l'apparence d'une vue actuellement dans une fenêtre, supprimez la vue de la hiérarchie des vues, puis remettez-la en place.

En d'autres termes: appeler ce code dans les méthodes init() ou init(coder:)will changer l'apparence de l'objet UI, mais appeler dans loadView(), ou viewDidLoad() de viewController ne sera pas.
Si vous souhaitez définir l'apparence de l'application entière, application(_:didFinishLaunchingWithOptions:) est un bon endroit pour appeler ce code.

31
Grubas

Vous pouvez modifier la couleur du lien hypertexte dans une vue texte en procédant comme suit:

Dans le fichier Nib, vous pouvez aller dans la fenêtre Propriétés et modifier la teinte à laquelle vous voulez la couleur.

ou vous pouvez également le faire par programme en utilisant le code ci-dessous

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
12
Manju

Le problème avec UITextView linkTextAttributes est qu'il s'applique à tous les liens détectés automatiquement. Et si vous voulez que différents liens aient des attributs différents?

Il s'avère qu'il y a une astuce: configurer les liens dans le cadre du texte attribué à la vue texte, et définir linkTextAttributes dans un dictionnaire vide.

Voici un exemple dans 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 = [:]
10
matt

La couleur de la teinte peut également se faire dans le storyboard

enter image description here

4
Ryan Heitner

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

EDIT: Mon application a été approuvée par Apple bien que l'utilisation de l'API privée!

Déclarez d'abord une catégorie sur UITextView avec les méthodes

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

Ils font juste 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 style avec une couleur spécifique sur tous les types de liens.

Les UITextViews sont rendus Webiview comme via des divs afin que vous puissiez même 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>

Le x-Apple-data-detectors-type="link" est l'indicateur du type exact du lien

MODIFIER

Sur iOS7cela ne fonctionne plus. Dans iOS7, vous pouvez facilement changer la couleur du lien de UITextViews en définissant la couleur de teinte. Vous ne devez pas appeler

- (id)contentAsHTMLString;

plus, vous obtiendrez une exception. Effectuez plutôt les opérations suivantes si vous souhaitez prendre en charge iOS 7 et les versions antérieures:

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

EDIT: Ne le faites pas avec UITextView, utilisez plutôt UIWebView.

Vous devez faire une feuille de style pour cela. Définissez une classe là-bas 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;
}

utilisez maintenant la classe 'headercopy' dans votre page html comme celle-ci-

<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 dont vous avez besoin avec la fonctionnalité de clic.

1
Vaibhav Saran

Ce code définira la couleur d'un numéro de téléphone sur un I-Phone mais annule le lien d'appel automatique.

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