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 remplace par blueColor . Est-il possible de formater la couleur des liens détectés automatiquement, ou devrais-je essayer une version manuelle de cette fonction?

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

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

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, créez simplement un fichier CSS standard pour la balise.

J’ai utilisé quelque chose comme ça:

 NSSsortingng * htmlSsortingng = [NSSsortingng ssortingngWithFormat:@"

%@

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

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

Swift 4.x:

 UITextView.appearance().linkTextAtsortingbutes = [ NSAtsortingbutedSsortingngKey.foregroundColor.rawValue: UIColor.red ] 

Swift 3.x:

 UITextView.appearance().linkTextAtsortingbutes = [ NSForegroundColorAtsortingbuteName: UIColor.red ] 

Swift 2.x:

 UITextView.appearance().linkTextAtsortingbutes = [ NSForegroundColorAtsortingbuteName: UIColor.redColor() ] 

Objectif c:

 [UITextView appearance].linkTextAtsortingbutes = @{ NSForegroundColorAtsortingbuteName : UIColor.redColor }; 

L’apparence pour UITextView n’est pas documentée, mais fonctionne bien.

Gardez à l’esprit les notes de UIAppearance :

iOS applique des modifications d’apparence lorsqu’une vue entre dans une fenêtre, cela ne change pas l’apparence d’une vue qui se trouve 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 replacez-la.

En d’autres termes: L’appel de ce code dans les méthodes init() ou init(coder:) modifiera l’apparence de l’object d’interface utilisateur, mais l’appel dans loadView() ou viewDidLoad() de viewController ne le sera pas .
Si vous souhaitez définir l’apparence de toute l’application, l’ application(_:didFinishLaunchingWithOptions:) est un bon endroit pour appeler un tel code.

Vous pouvez modifier la couleur de lien hypertexte dans un TextView par les éléments suivants:

Dans le fichier Nib, vous pouvez accéder à la fenêtre Propriétés et remplacer la teinte par la couleur souhaitée.

ou vous pouvez aussi le faire par programmation en utilisant le code ci-dessous

 [YOURTEXTVIEW setTintColor:[UIColor whiteColor]]; 

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

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

D’abord déclarer une catégorie sur UITextView avec les méthodes

 - (id)contentAsHTMLSsortingng; - (void)setContentToHTMLSsortingng:(id)arg1; 

Ils ne font que ce qui suit:

 - (id)contentAsHTMLSsortingng; { return [super contentAsHTMLSsortingng]; } - (void)setContentToHTMLSsortingng:(id)arg1; { [super setContentToHTMLSsortingng:arg1]; } 

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

 - (void) colorfillLinks; { NSSsortingng *contentSsortingng = [self.textViewCustomText contentAsHTMLSsortingng]; contentSsortingng = [contentSsortingng ssortingngByReplacingOccurrencesOfSsortingng:@"x-apple-data-detectors=\"true\"" withSsortingng:@"x-apple-data-detectors=\"true\" style=\"color:white;\""]; [self.textViewCustomText setContentToHTMLSsortingng:contentSsortingng]; } 

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

UITextViews est rendu Webiview comme via des divs afin que vous puissiez même aller plus loin et colorer chaque type de lien séparément:

  

Le x-apple-data-detectors-type="link" est l’indicateur du type exact du lien

MODIFIER

Sur iOS7 cela ne fonctionne plus. Dans iOS7, vous pouvez facilement modifier la couleur de lien de UITextViews en définissant la couleur de la teinte. Vous ne devriez pas appeler

 - (id)contentAsHTMLSsortingng; 

plus, vous aurez une exception. Au lieu de cela, procédez comme suit si vous souhaitez prendre en charge iOS 7 et les versions suivantes:

 - (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 ]) { NSSsortingng *contentSsortingng = [self contentAsHTMLSsortingng]; contentSsortingng = [contentSsortingng ssortingngByReplacingOccurrencesOfSsortingng:@"x-apple-data-detectors=\"true\"" withSsortingng:@"x-apple-data-detectors=\"true\" style=\"color:#DDDDDE;\""]; [self setContentToHTMLSsortingng:contentSsortingng]; } } 

La couleur de teinte peut être faite dans le storyboard aussi

entrer la description de l'image ici

Le problème avec UITextView linkTextAtsortingbutes est qu’il s’applique à tous les liens détectés automatiquement. Que faire si vous souhaitez que différents liens aient des atsortingbuts différents?

Il s’avère qu’il existe une astuce: configurez les liens dans le cadre du texte atsortingbué de la vue texte et définissez le linkTextAtsortingbutes sur un dictionnaire vide .

Voici un exemple dans iOS 11 / Swift 4:

 // mas is the mutable atsortingbuted ssortingng we are forming... // ... and we're going to use as the text view's `atsortingbutedText` mas.append(NSAtsortingbutedSsortingng(ssortingng: "LINK", atsortingbutes: [ NSAtsortingbutedSsortingngKey.link : URL(ssortingng: "https://www.apple.com")!, NSAtsortingbutedSsortingngKey.foregroundColor : UIColor.green, NSAtsortingbutedSsortingngKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue ])) // ... self.tv.atsortingbutedText = mas // this is the important thing: self.tv.linkTextAtsortingbutes = [:] 

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

Vous devez créer une feuille de style pour cela. Définissez 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; } 

utilisez maintenant la classe ‘headercopy’ dans votre page HTML comme ceci-

 Fax: 646-200-7535

Cela affichera le numéro de téléphone dans la couleur dont vous avez besoin avec la fonctionnalité de clic.

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