我可以更改UITextView上自动检测链接的颜色吗?
我有一个UITextView
检测电话号码和链接,但是这覆盖了我的fontColor
并将其更改为blueColor
。 有没有办法来格式化自动检测到的链接的颜色,或者我应该尝试手动版本的这个function?
在iOS 7上,您可以设置UITextView
的tintColor
。 它会影响链接颜色以及光标行和选定的文本颜色。
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 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 = [:]