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

时间:2009-08-29 04:09:49

标签: iphone uitextview iphone-sdk-3.0 uicolor

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

11 个答案:

答案 0 :(得分:154)

在iOS 7上,您可以设置tintColor的{​​{1}}。它会影响链接颜色以及光标线和选定的文本颜色。

iOS 7还为名为UITextView的{​​{1}}添加了一个新属性,可让您完全控制链接样式。

答案 1 :(得分:40)

我没有使用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];

答案 2 :(得分:28)

您可以使用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对象外观,但调用viewController的loadView()viewDidLoad() 不会即可。
如果要为整个应用程序设置外观,application(_:didFinishLaunchingWithOptions:)是调用此类代码的好地方。

答案 3 :(得分:11)

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

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

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

[YOURTEXTVIEW setTintColor:[UIColor whiteColor]];

答案 4 :(得分:8)

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

答案 5 :(得分:4)

色彩颜色也可以在故事板中完成

enter image description here

答案 6 :(得分:3)

我发现确实采用了另一种方式而不使用网页浏览,但请注意,这会使用私有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];
}

它会在所有类型的链接上使用特定颜色设置style属性。

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

}
}

答案 7 :(得分:1)

修改 请勿使用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 />

这将以点击功能显示所需颜色的电话号码。

答案 8 :(得分: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>

答案 9 :(得分: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

答案 10 :(得分:0)

快速5答案

又好又简单

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