XZ_iOS之UITextView或UITextField实时修改输入的部分文字的颜色(上)

项目开发时,用到了这样一个功能,类似于微博的话题,用户点击的时候,需要插入关键词文本到textView中,并显示成红色,当用户输入的时候,就是黑色字体;
即,两个[]之间的字体为红色。
最终实现效果:


首先,要想实现这种效果,最先想到的是使用富文本NSMutableAttributedString将[]范围内的文字修改为红色;
1>使用正则表达式,匹配所有[]范围的文字的range,将所有[]范围内的文字改为红色;
2>将修改完的文字赋值给textView,修改textView的光标位置;
// 找到所有的关键词,并修改颜色
- (void)findAllKeywordsChangeColor:(UITextView *)textView {
    NSString *string = textView.text;
    // 记录光标位置
    NSRange rangeDefault = textView.selectedRange;
    
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString: string];
    
    [attrStr addAttribute:NSForegroundColorAttributeName value:COLOR102 range: NSMakeRange(0, string.length)];
    
    NSString *pattern = @"\\[(.*?)\\]";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options: NSRegularExpressionCaseInsensitive error:nil];
    
    // 匹配所有项
    NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)];
    
    NSLog(@"matches ==== %@",matches);
    
    //
    for (int i = 0; i < matches.count; i++) {
        NSTextCheckingResult *result = matches[i];
        NSRange range = [result rangeAtIndex:0];
        NSLog(@"查找合适的位置location:%lu-----%lu",range.location,range.length);
        NSString *subStr = [attrStr.string substringWithRange:range];
        NSUInteger length = subStr.length;
        [attrStr addAttribute:NSForegroundColorAttributeName value:kXZMainBgColor range:NSMakeRange(range.location, length)];
    }
    [attrStr addAttribute:NSFontAttributeName value:self.textEdit.font range:NSMakeRange(0, string.length)];
    self.textEdit.attributedText = attrStr;
    // 恢复光标位置
    NSRange rangeNow = NSMakeRange(rangeDefault.location, 0);
    textView.selectedRange = rangeNow;
}
需要注意的是:在textView中,当输入文字的时候,下一个文字的颜色和字体等属性,是跟随前一个文字的颜色和字体属性进行设置的,所以,在修改完颜色之后,要统一设置一遍textView的文字的字体大小:
[attrStr addAttribute:NSFontAttributeName value:self.textEdit.font range:NSMakeRange(0, string.length)];
实现是可以了,但是,现在是在哪个方法实现这种效果呢,当输入文字的文字改变的时候进行修改,所以就在textViewDidChange代理方法中实现效果。
当我运行查看效果的时候,发现是如下的效果:
在键盘上拼拼音的时候,还没有拼好,拼音就已经进入了输入框,原因是:当我们在拼拼音的时候,textViewDidChange代理方法也是在执行的,只要执行就会把值赋给textView,所以就显示出来了。

解决这个问题的思路是:找到一个点,刚好我拼完拼音,写入的时候,再进行修改和赋值。查找资料发现textView还有联想词这一说法,就是在中文输入的时候,当拼拼音的时候,把一些可能的结果高亮展示出来,所以,我们就在改变颜色赋值之前需要做个判断,判断当前是否联想词的高亮状态,将代码修改为如下:
- (void)textViewDidChange:(UITextView *)textView {

    UITextRange *selectedRange = [textView markedTextRange];
    
    // 获取高亮字符的位置
    UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
    // 如果没有高亮字符,修改颜色赋值
    if (!position) {
        [self findAllKeywordsChangeColor:textView];
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Swift,可以使用NSAttributedString类来更改指定文字颜色。可以使用属性字典,设置文字颜色属性,并将其设置为NSAttributedString对象的属性,即可更改指定文字颜色。 ### 回答2: 要想在Swift更改一段文字指定两个文字颜色,我们可以使用NSMutableAttributedString来实现。NSMutableAttributedString是NSAttributedString的子类,它允许我们对NSAttributedString进行修改和编辑。 首先,我们需要将一段文字转换为NSMutableAttributedString类型的对象。可以使用NSAttributedString的构造函数来实现这一点,将要修改文字作为参数传递进去。接下来,我们可以使用addAttributes(_:range:)方法来为指定的文字添加属性。 在我们的情况下,我们要更改两个文字颜色。我们可以使用NSAttributedString.Key.foregroundColor这个键来指定文字颜色属性。我们需要为NSMutableAttributedString的指定范围添加这个属性。范围可以使用range(of:)方法来确定。 下面是一个示例代码,展示了如何使用NSMutableAttributedString来更改一段文字指定两个文字颜色: ```swift let text = "Hello World" let attributedText = NSMutableAttributedString(string: text) let firstWord = "Hello" let secondWord = "World" let rangeOfFirstWord = (text as NSString).range(of: firstWord) let rangeOfSecondWord = (text as NSString).range(of: secondWord) attributedText.addAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], range: rangeOfFirstWord) attributedText.addAttributes([NSAttributedString.Key.foregroundColor: UIColor.blue], range: rangeOfSecondWord) // 将attributedText赋值给显示文本的UILabel或UITextView ``` 以上代码,我们创建了一个NSMutableAttributedString对象attributedText,并将原始文字"Hello World"传递给它。然后,我们找到"Hello"和"World"在attributedText的范围,并为它们分别设置了红色和蓝色的颜色属性。最后,我们可以将attributedText赋值给显示文本的UILabel或UITextView,以显示已更改颜色的文本。 这样,我们就成功地使用Swift更改了一段文字指定两个文字颜色。 ### 回答3: 要将一段文字的指定两个文字颜色进行更改,我们可以使用NSAttributedString来实现。 首先,我们需要创建一个NSMutableAttributedString对象,它是NSAttributedString的可变版本。然后,我们可以使用addAttributes(_:range:)方法来为指定的文字添加属性。 下面是一个示例代码,展示了如何将一段文字的指定两个文字改变颜色: ```swift // 原始文本 let text = "Hello, World!" // 创建NSMutableAttributedString对象 let attributedText = NSMutableAttributedString(string: text) // 设置指定文字的属性 let firstWordRange = (text as NSString).range(of: "Hello") let secondWordRange = (text as NSString).range(of: "World") let textColor = UIColor.blue attributedText.addAttributes([NSAttributedString.Key.foregroundColor: textColor], range: firstWordRange) attributedText.addAttributes([NSAttributedString.Key.foregroundColor: textColor], range: secondWordRange) ``` 在上面的代码,我们首先创建了一个字符串"Hello, World!"。然后,我们使用NSMutableAttributedString将其转换为可变的属性字符串对象。 接下来,我们使用NSString的range(of:)方法找到指定文字的范围。然后,我们使用addAttributes(_:range:)方法为这些范围内的文字添加属性,其属性为指定的文本颜色(这里设置为蓝色)。 这样,我们就成功地将一段文字的指定两个文字颜色进行了更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值