如何改变UITextView链接的颜色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何改变UITextView链接的颜色相关的知识,希望对你有一定的参考价值。

参考技术A   在ios 7里你可以设置UITextView的 tintColor。它会影响链接的颜色,以及光标和选择文本的颜色。
  Leandro Alves
  我用UIWebView 代替UITextView,启用"auto-detect links"。只要给TAG创建一个固定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];
  Alexander
  我发现一个不用Webview的方式。但是得使用私有API,并且可能被Appstore拒绝。
  注:我的APP 虽然用了私有API,但是通过了Appstore的批准。
  先用下面的函数在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];
  这能给所有类型的连接设置特定颜色的样式属性。
  使用div可以使UITextViews像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"是正确链接类型的指示器。
  注:这个在iOS 7 里就不起作用了。在iOS 7 里,设置就可以轻松改变链接的颜色。不要调用
  - (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 中为文本着色

【中文标题】如何在 UITextView 中为文本着色【英文标题】:How to color text in UITextView 【发布时间】:2016-04-05 10:32:38 【问题描述】:

我在视图控制器上有四个按钮和一个文本视图。这五个按钮有颜色,例如红色、黄色、绿色、蓝色和黑色。

当用户开始键入而不按这些按钮时,正在键入的文本视图的颜色应该是黑色文本。如果用户按下红色按钮,那么从该点开始的文本颜色应该是红色,直到用户按下任何其他颜色的按钮。

如何做到这一点?我已经按照这个教程https://www.objc.io/issues/5-ios7/getting-to-know-textkit/

但不知道如何将其定制为我想要实现的目标。

【问题讨论】:

您可能想尝试子类化UITextView 并实现/覆盖UITextInput 协议的textStylingAtPosition(_:inDirection:) 【参考方案1】:

如果对您有帮助,我会按照以下方式进行:

1- add one property to retain current Color  and initialize it with black color 

 @property (nonatomic, retain) UIColor *curColor;//in your interface declaration

self.curColor = [UIColor blackColor];//Init it in Viewdidload for example

2- 实现 UITextViewDelegate

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text


    NSAttributedString *currentText = self.Textview.attributedText;//To store current text and its attributs
    NSAttributedString *newOneText = [[NSAttributedString alloc] initWithString:text attributes:@NSForegroundColorAttributeName:self.curColor];//for the new text with selected color

    NSMutableAttributedString  *shouldDisplayText = [[NSMutableAttributedString alloc] initWithAttributedString: currentText];

    [shouldDisplayText appendAttributedString: newOneText];// add old and new text

    self.Textview.attributedText = shouldDisplayText;//set it ton control


    return NO;

3- 添加 IBAction 来改变颜色 =>

 - (IBAction) redColorClicked
    
     self.curColor = [UIColor colorWithRed:1.0f green: 0.0f blue:0.0f alpha:1.0f];
   

- (IBAction) blueColorClicked
        
         self.curColor = [UIColor colorWithRed:0.0f green: 0.0f blue:1.0f alpha:1.0f];
   

【讨论】:

虽然这是实现预期结果的方法,但当按下键盘中的字符时,它会加倍输入的字符。如何在不重复字符的情况下做到这一点? 嗨!抱歉回复晚了。对于如何在不重复字符的情况下做到这一点?只需更改 UITextView 委托的返回值: - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 为 NO,您就完成了。我修改了上面的代码来满足你的需要【参考方案2】:

你需要使用NSAttributedString类。

let defaultAttributes = [NSFontAttributeName: UIFont.systemFontOfSize(UIFont.systemFontSize()),
                         NSForegroundColorAttributeName: UIColor.blackColor()]
let text = "this text is red and yellow"
let str = NSMutableAttributedString(string: text, attributes: defaultAttributes)
str.setAttributes([NSForegroundColorAttributeName: UIColor.redColor()], range: (text as NSString).rangeOfString("red"))
str.setAttributes([NSForegroundColorAttributeName: UIColor.yellowColor()], range: (text as NSString).rangeOfString("yellow"))
textView.attributedText = str

【讨论】:

【参考方案3】:

您可以使用 NSMutableAttributedString 来实现。思路如下(我没有测试,这里是手写的):

NSString *str = @"***";
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:str];

// Set foreground color of "stack" substring in our string to red
[attributedString addAttribute:NSForegroundColorAttributeName
  value:[UIColor redColor];
  range:NSMakeRange(0, 5)];

使用此方法,您可以实现将颜色应用于文本中所需范围的目标。

你可以像这样为你的 UILabel 设置属性文本:

yourLabel.attributedText = attributedString

【讨论】:

以上是关于如何改变UITextView链接的颜色的主要内容,如果未能解决你的问题,请参考以下文章

无法更改 UIText 视图的字体(使用 Web 服务时)

如何在 UITextView 中实现滚动功能?

根据内容大小属性设置 UIText 视图的宽度

UITextField PlaceHolder 颜色改变 Monotouch

如何在不阻止 textView 触摸的情况下向所有 UITextView 添加一个 UIGestureRecognizer

UIPopOver、UITextView 和自动调整大小