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

我有一个UITextView检测电话号码和链接,但是这覆盖了我的fontColor并将其更改为blueColor 。 有没有办法来格式化自动检测到的链接的颜色,或者我应该尝试手动版本的这个function?

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

iOS 7还向UITextView添加了一个名为linkTextAttributes的新属性,它将让您完全控制链接样式。

我使用了一个UIWebView,并启用了“自动检测链接”,而不是使用UITextView。 要更改链接颜色,只需为标记创build一个常规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]; 

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

在笔尖文件中,您可以转到“属性”窗口并将“色调”更改为您想要的任何颜色。

或者你也可以通过使用下面的代码来编程

 [YOURTEXTVIEW setTintColor:[UIColor whiteColor]]; 

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

Swift 4.x:

 UITextView.appearance().linkTextAttributes = [ NSAttributedStringKey.foregroundColor.rawValue: 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 }; 

UITextView外观没有logging,但效果很好。

请记住UIAppearance笔记:

当视图进入一个窗口时,iOS应用外观变化,它不会改变已经在窗口中的视图的外观。 要更改当前位于窗口中的视图的外观,请从视图层次结构中删除该视图,然后放回该视图。

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

我发现确实没有使用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]; } 

它会在所有types的链接上使用特定的颜色设置样式属性。

UITextViews像通过div一样呈现Webiview,所以你甚至可以进一步去着色每个链接types:

 <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"x-apple-data-detectors-type="link"确切types的指示符

编辑

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

编辑:不要做与UITextView ,而是使用UIWebView

你需要为此做一个样式表。 用你需要的颜色组合来定义一个类 –

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

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

此代码将设置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> 

UITextView linkTextAttributes的问题是,它适用于所有自动检测到的链接。 如果你想要不同的链接有不同的属性呢?

原来有一个技巧:将链接configuration为文本视图的属性文本的一部分, 并将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 = [:]