我有一个UITextView
可检测电话号码和链接的,但这会覆盖我的电话fontColor
并将其更改为blueColor
。是否可以格式化自动检测到的链接的颜色,还是应该尝试使用此功能的手动版本?
我有一个UITextView
可检测电话号码和链接的,但这会覆盖我的电话fontColor
并将其更改为blueColor
。是否可以格式化自动检测到的链接的颜色,还是应该尝试使用此功能的手动版本?
Answers:
在iOS 7上,您可以设置tintColor
的UITextView
。它会影响链接颜色以及光标线和所选文本的颜色。
iOS 7还向UITextView
调用添加了一个新属性,linkTextAttributes
该属性似乎可以让您完全控制链接样式。
NSFontAttributeName
用linkTextAttributes
。我曾在同一范围内我手动指定的字体NSLinkAttributeName
我不使用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];
您可以使用 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:)
则是调用此类代码的好地方。
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 = [:]
我确实找到了另一种无需使用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];
}
}
编辑:
不要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 />
这将以您需要的颜色通过点击功能显示电话号码。
这是我使用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