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?
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.
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];
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.
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]];
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 = [:]
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 iOS7
cela 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];
}
}
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.
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 0232 963 959</a></div>