I had a UITextView
that detects phone numbers and links, but this overrides my fontColor
and change it to blueColor
. Is there a way to format the color of auto detected links, or should I try a manual version of this function?

- 7,983
- 3
- 57
- 80

- 2,190
- 3
- 19
- 24
-
Check this answer using a private-api subview UIWebDocumentView: http://stackoverflow.com/a/11745983/111277 – situee Jan 27 '14 at 06:19
11 Answers
On iOS 7 you can set the tintColor
of the UITextView
. It affects the link color as well as the cursor line and the selected text color.
iOS 7 also added a new property to UITextView
called linkTextAttributes
which would appear to let you fully control the link style.
-
3I've given further explanation in this answer: http://stackoverflow.com/a/21027340/1202222 – Tim Windsor Brown Dec 10 '14 at 17:00
-
1On iOS 10.3, I wasn't able to override the `NSFontAttributeName` with `linkTextAttributes`. I had to manually specify the font in the same range as my `NSLinkAttributeName` – Heath Borders Oct 19 '17 at 04:24
You can use the UIAppearance
protocol to apply changes for all text views:
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() ]
Objective-C:
[UITextView appearance].linkTextAttributes = @{ NSForegroundColorAttributeName : UIColor.redColor };
Appearance for UITextView
is not documented, but works well.
Keep in mind UIAppearance
notes:
iOS applies appearance changes when a view enters a window, it doesn’t change the appearance of a view that’s already in a window. To change the appearance of a view that’s currently in a window, remove the view from the view hierarchy and then put it back.
In other words:
Calling this code in init()
, or init(coder:)
methods will change UI Object appearance, but calling in loadView()
, or viewDidLoad()
of viewController won't.
If you want to set appearance for whole application, application(_:didFinishLaunchingWithOptions:)
is good place for calling such code.

- 602
- 5
- 13
-
I prefer this one over the selected answer, as I want to use a different color for the cursor/text selection and links – Kevin R Jun 08 '16 at 11:21
-
I have use a UITextView and write above code in viewdidload. but when I write email in text field and enter space color is not changing. – Raj Aggrawal Aug 02 '16 at 07:45
Instead of using an UITextView, I used an UIWebView and enabled the "auto-detect links". To change the link color, just created a regular CSS for the tag.
I used something like this:
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];

- 2,190
- 3
- 19
- 24
-
15
-
I know... but I don't know any workaround less hackish. Apple should really think about these little details. – Leandro Alves Jun 07 '13 at 15:25
-
@Oscar well, i think it's less hackish than Alexanders answer. Still crazy that there's no simple property for such a fundamental functionality. – Andy Aug 29 '13 at 15:43
-
1
-
completely agree with "asdasd". Web approach is very expensive, they to see how much ram does it use. for such a simple task use textview and properties Apple gives. – ingconti May 30 '17 at 08:25
The problem with UITextView linkTextAttributes
is that it applies to all automatically detected links. What if you want different links to have different attributes?
It turns out there's a trick: configure the links as part of the text view's attributed text, and set the linkTextAttributes
to an empty dictionary.
Here's an example 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 = [:]

- 515,959
- 87
- 875
- 1,141
-
My String is "Want to learn iOS?" You should visit the best source of free iOS tutorials! Swift checking hello http://www.google.com Attributed 9826012345 String testing in on going..." and Default link attribute is required for web link and mobile number. But I want to make a link for string part "Want to learn iOS?" in different color with link..So self.tv.linkTextAttributes = [:] is working only for custom link. – BalKrishan Yadav Jan 10 '18 at 11:05
You can Change the Hyperlink Color in a TextView by the following:
In the Nib file, you can go to the Properties Window and change the Tint to which ever color you want to.
or you can also do it programatically by using the below code
[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];
Swift 5 Answer
Nice and simple
myTextView.linkTextAttributes = [.foregroundColor: UIColor.white]

- 269
- 4
- 4
I found indeed another way without using a webview but keep in mind that this uses private API and may be rejected in appstore:
EDIT: My app got approved by apple although the private api usage!
First declare a category on UITextView with the methods
- (id)contentAsHTMLString;
- (void)setContentToHTMLString:(id)arg1;
They are just doing the following:
- (id)contentAsHTMLString;
{
return [super contentAsHTMLString];
}
- (void)setContentToHTMLString:(id)arg1;
{
[super setContentToHTMLString:arg1];
}
Now write a method for colorful 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];
}
It does set the style attribute with a specific color on all types of links.
UITextViews are rendered Webiview like via divs so you could even go further and color each link type separately:
<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>
The x-apple-data-detectors-type="link"
is the indicator for the exact type of the link
EDIT
On iOS7
this is no longer working. In iOS7 you could easily change the link color of UITextViews by setting the tint color. You should not call
- (id)contentAsHTMLString;
anymore, you'll get an exception. Instead do the following if you want to support iOS 7 and below:
- (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];
}
}

- 7,178
- 8
- 45
- 75
EDIT:
Don't do it with UITextView
, use UIWebView
instead.
You need to make a stylesheet for that. Define a class there with the color combination you need-
.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;
}
now use the class 'headercopy' into you html page like this-
<b>Fax:</b><a href="tel:646.200.7535" class="headercopy"> 646-200-7535</a><br />
this will display the phone number in the color you need with click functionality.

- 12,848
- 3
- 65
- 75
This code will set the colour of a phone number on an I-Phone but voids the automatic call link.
<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>

- 21
- 3
This is how I did it using Swift 5:
let attributedString = NSMutableAttributedString(string: myTextView.text ?? "")
myTextView.linkTextAttributes = [NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.whiteColor] as [NSAttributedString.Key: Any]?
myTextView.attributedText = attributedString

- 4,059
- 7
- 38
- 57