我可以更改UITextView上自动检测到的链接的颜色吗?


115

我有一个UITextView可检测电话号码和链接的,但这会覆盖我的电话fontColor并将其更改为blueColor。是否可以格式化自动检测到的链接的颜色,还是应该尝试使用此功能的手动版本?


使用private-api子视图UIWebDocumentView来检查此答案:stackoverflow.com/a/11745983/111277
situee 2014年

Answers:


170

在iOS 7上,您可以设置tintColorUITextView。它会影响链接颜色以及光标线和所选文本的颜色。

iOS 7还向UITextView调用添加了一个新属性,linkTextAttributes该属性似乎可以让您完全控制链接样式。


2
我已经在这个答案中给出了进一步的解释:stackoverflow.com/a/21027340/1202222
Tim Windsor Brown

在iOS 10.3,我是不是能够覆盖NSFontAttributeNamelinkTextAttributes。我曾在同一范围内我手动指定的字体NSLinkAttributeName
希思国界

37

我不使用UITextView,而是使用UIWebView并启用了“自动检测链接”。要更改链接颜色,只需为标签创建常规CSS。

我用了这样的东西:

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
对于这样一个简单的任务,这似乎非常骇人听闻。
yuikonnu 2013年

我知道...但是我不知道有什么变通办法可以减少黑客行为。苹果真的应该考虑这些小细节。
Leandro Alves 2013年

@Oscar好吧,我认为这不如Alexanders的回答强硬。仍然为如此基本的功能没有简单的属性而感到疯狂。
安迪

1
问题是关于textview而不是webview!
鲍里斯·加富罗夫

完全同意“ asdasd”。Web方法非常昂贵,他们看到它使用了多少内存。对于此类简单任务,请使用Apple提供的textview和属性。
ingconti

37

您可以使用 UIAppearance协议对所有文本视图应用更改:

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

目标C:

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

外观 UITextView未记录,但效果很好。

注意UIAppearance事项:

当视图进入窗口时,iOS会应用外观更改,但不会更改窗口中已有视图的外观。要更改当前在窗口中的视图的外观,请从视图层次结构中删除该视图,然后将其放回原处。

换句话说:在init()init(coder:)方法中调用此代码更改UI对象的外观,但在loadView()viewDidLoad()viewController中的调用则不会
如果要为整个应用程序设置外观,application(_:didFinishLaunchingWithOptions:)则是调用此类代码的好地方。


我更喜欢此答案,而不是所选答案,因为我想为光标/文本选择和链接使用不同的颜色
Kevin R

这是最好的最新答案。
yuzer

我已经使用UITextView并在viewdidload中编写了以上代码。但是当我在文本字段中输入电子邮件并输入空格时,颜色没有变化。
Raj Aggrawal

18

UITextView的问题linkTextAttributes在于它适用于所有自动检测到的链接。如果您希望不同的链接具有不同的属性怎么办?

事实证明,这里有一个技巧:将链接配置为文本视图的属性文本的一部分,并将设置linkTextAttributes为空字典

这是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 = [:]

我的字串是“想学习iOS吗?” 您应该访问免费的iOS教程的最佳来源!快速检查您好google.com,属性为9826012345正在进行字符串测试...”,并且Web链接和手机号码需要使用默认链接属性。但是我想为字符串部分“想要学习iOS?”创建不同颜色的链接。与link..So self.tv.linkTextAttributes = [:]的工作只为自定义链接。
BalKrishan亚达夫

14

您可以通过以下方法更改TextView中的超链接颜色:

在Nib文件中,您可以转到“属性”窗口,然后将“色调”更改为所需的颜色。

或者您也可以使用以下代码以编程方式进行操作

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];


3

我确实找到了另一种无需使用webview的方法,但是请记住,这使用了私有API,可能会在appstore中被拒绝:

编辑:尽管私人api的使用,我的应用程序还是得到了苹果的认可!

首先使用方法在UITextView上声明一个类别

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

他们只是在做以下事情:

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

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

现在编写彩色链接的方法:

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

它确实在所有类型的链接上为样式属性设置了特定的颜色。

UITextViews就像通过div呈现为Webiview一样,因此您甚至可以更进一步为每种链接类型分别上色:

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

x-apple-data-detectors-type="link"是链接确切类型的指标

编辑

iOS7此不再起作用。在iOS7中,您可以通过设置颜色来轻松更改UITextViews的链接颜色。你不应该打电话

- (id)contentAsHTMLString;

而且,您将获得一个例外。如果要支持iOS 7及以下版本,请执行以下操作:

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

斯威夫特5答案

漂亮又简单

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

0

编辑: 不要UITextViewUIWebView代替。

您需要为此制作样式表。使用所需的颜色组合定义一个类别-

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

现在使用“ headercopy”类到您的html页面中,如下所示:

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

这将以您需要的颜色通过点击功能显示电话号码。


对于本机应用程序而言,使用Web视图是一种不良的编程风格。
ingconti

0

该代码将设置I-Phone上电话号码的颜色,但会导致自动呼叫链接无效。

<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

这是我使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.