Kann ich die Farbe automatisch erkannter Links in UITextView ändern?


115

Ich hatte eine UITextView, die Telefonnummern und Links erkennt, aber dies überschreibt meine fontColorund ändert sie in blueColor. Gibt es eine Möglichkeit, die Farbe automatisch erkannter Links zu formatieren, oder sollte ich eine manuelle Version dieser Funktion ausprobieren?


Überprüfen Sie diese Antwort mit einer privaten API-Unteransicht UIWebDocumentView: stackoverflow.com/a/11745983/111277
situee

Antworten:


169

Auf iOS 7 können Sie den Satz tintColorvon der UITextView. Dies wirkt sich sowohl auf die Linkfarbe als auch auf die Cursorzeile und die ausgewählte Textfarbe aus.

iOS 7 hat außerdem eine neue Eigenschaft hinzugefügt, UITextViewmit linkTextAttributesder Sie den Linkstil vollständig steuern können.


2
Ich habe weitere Erklärungen in dieser Antwort gegeben: stackoverflow.com/a/21027340/1202222
Tim Windsor Brown

Auf iOS 10.3 war ich außer Kraft setzt nicht in der Lage NSFontAttributeNamemit linkTextAttributes. Ich musste die Schriftart manuell im gleichen Bereich wie meineNSLinkAttributeName
Heath Borders

37

Anstatt ein UITextView zu verwenden, habe ich ein UIWebView verwendet und die "Links zur automatischen Erkennung" aktiviert. Um die Linkfarbe zu ändern, haben Sie einfach ein reguläres CSS für das Tag erstellt.

Ich habe so etwas benutzt:

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

13
Dies scheint für eine so einfache Aufgabe äußerst hackisch zu sein.
Yuikonnu

Ich weiß ... aber ich kenne keine weniger hackige Problemumgehung. Apple sollte wirklich über diese kleinen Details nachdenken.
Leandro Alves

@ Oscar gut, ich denke, es ist weniger hackisch als Alexanders Antwort. Immer noch verrückt, dass es für eine so grundlegende Funktionalität keine einfache Eigenschaft gibt.
Andy

1
Frage ist über Textansicht nicht Webview!
Boris Gafurov

stimme voll und ganz mit "asdasd" überein. Web-Ansatz ist sehr teuer, sie sehen, wie viel RAM es verwendet. Verwenden Sie für eine so einfache Aufgabe die Textansicht und die Eigenschaften, die Apple bietet.
Ingconti

37

Sie können das UIAppearanceProtokoll verwenden, um Änderungen für alle Textansichten anzuwenden:

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

Ziel c:

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

Aussehen für UITextViewist nicht dokumentiert, funktioniert aber gut.

Beachten Sie die UIAppearanceHinweise:

iOS wendet Änderungen am Erscheinungsbild an, wenn eine Ansicht in ein Fenster eingeht. Es ändert nicht das Erscheinungsbild einer Ansicht, die sich bereits in einem Fenster befindet. Um das Erscheinungsbild einer Ansicht zu ändern, die sich derzeit in einem Fenster befindet, entfernen Sie die Ansicht aus der Ansichtshierarchie und setzen Sie sie zurück.

Mit anderen Worten: Dem Aufruf diesen Code in init()oder init(coder:)Methoden werden UI Objekt Aussehen ändern, aber Aufruf in loadView()oder viewDidLoad()von Viewcontroller wird nicht .
Wenn Sie das Erscheinungsbild für die gesamte Anwendung festlegen möchten, application(_:didFinishLaunchingWithOptions:)ist dies ein guter Ort, um einen solchen Code aufzurufen.


Ich bevorzuge diese gegenüber der ausgewählten Antwort, da ich eine andere Farbe für die Cursor- / Textauswahl und die Links verwenden möchte
Kevin R

Dies ist die beste und aktuellste Antwort.
Yuzer

Ich habe eine UITextView verwendet und den obigen Code in viewdidload geschrieben. Aber wenn ich eine E-Mail in ein Textfeld schreibe und ein Leerzeichen eingebe, ändert sich die Farbe nicht.
Raj Aggrawal

18

Das Problem mit UITextView linkTextAttributesist, dass es für alle automatisch erkannten Links gilt. Was ist, wenn verschiedene Links unterschiedliche Attribute haben sollen?

Es stellt sich heraus, dass es einen Trick gibt: Konfigurieren Sie die Links als Teil des zugewiesenen Textes der Textansicht und setzen Sie das linkTextAttributesauf ein leeres Wörterbuch .

Hier ist ein Beispiel 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 = [:]

Meine Zeichenfolge lautet "Möchten Sie iOS lernen?" Sie sollten die beste Quelle für kostenlose iOS-Tutorials besuchen! Schnelle Überprüfung Hallo google.com Attributed 9826012345 String-Test läuft ... "und Standard-Link-Attribut ist für Weblink und Handynummer erforderlich. Ich möchte jedoch einen Link für den String-Teil" Möchten Sie iOS lernen? "In einer anderen Farbe erstellen mit link..So self.tv.linkTextAttributes = [:] funktioniert nur für benutzerdefinierte Link.
BalKrishan Yadav

14

Sie können die Hyperlinkfarbe in einer Textansicht folgendermaßen ändern:

In der Nib-Datei können Sie im Eigenschaftenfenster den Farbton auf die gewünschte Farbe ändern.

oder Sie können dies auch programmgesteuert mit dem folgenden Code tun

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

Ich habe in der Tat einen anderen Weg gefunden, ohne eine Webansicht zu verwenden, aber denke daran, dass dies eine private API verwendet und im Appstore abgelehnt werden kann:

EDIT: Meine App wurde von Apple genehmigt, obwohl die private API verwendet wird!

Deklarieren Sie zuerst eine Kategorie in UITextView mit den Methoden

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

Sie machen nur Folgendes:

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

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

Schreiben Sie nun eine Methode für bunte Links:

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

Das Stilattribut wird für alle Arten von Links mit einer bestimmten Farbe festgelegt.

UITextViews werden wie über divs in Webiview gerendert, sodass Sie sogar noch weiter gehen und jeden Link-Typ separat einfärben können:

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

Dies x-apple-data-detectors-type="link"ist der Indikator für den genauen Typ des Links

BEARBEITEN

Auf iOS7diese nicht mehr funktioniert. In iOS7 können Sie die Linkfarbe von UITextViews leicht ändern, indem Sie die Farbtonfarbe festlegen. Sie sollten nicht anrufen

- (id)contentAsHTMLString;

Sie werden keine Ausnahme mehr bekommen. Gehen Sie stattdessen wie folgt vor, wenn Sie iOS 7 und niedriger unterstützen möchten:

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

Swift 5 Antwort

Schön und einfach

myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]

0

EDIT: Mach es nicht mit UITextView, benutze es UIWebViewstattdessen.

Sie müssen dafür ein Stylesheet erstellen. Definieren Sie dort eine Klasse mit der gewünschten Farbkombination.

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

Verwenden Sie jetzt die Klasse 'Headercopy' in Ihrer HTML-Seite wie folgt:

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

Dadurch wird die Telefonnummer in der gewünschten Farbe mit Klickfunktion angezeigt.


Die Verwendung von Webansichten ist ein schlechter Programmierstil für native Apps.
Ingconti

0

Dieser Code legt die Farbe einer Telefonnummer auf einem I-Phone fest, macht jedoch die automatische Anrufverbindung ungültig.

<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

So habe ich es mit Swift 5 gemacht:

let attributedString = NSMutableAttributedString(string: myTextView.text ?? "")
myTextView.linkTextAttributes = [NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.whiteColor] as [NSAttributedString.Key: Any]?
myTextView.attributedText = attributedString
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.