uitextview实现开头部分文本着色及不让更改的效果

uitextview实现开头部分文本着色及不让更改的效果_第1张图片
效果图.png

实现思路

1、如何对部分文本着色

我们可以参考一下uitextview的这个属性

uitextview实现开头部分文本着色及不让更改的效果_第2张图片
attributedText.png

利用这个属性,我们可以对特定range之内的文本做着色处理

let topicText = "世界你好"
let text: NSMutableAttributedString = NSMutableAttributedString.init(string: "#\(topicText)# ")
text.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(red: 255 / 255, green: 23 / 255, blue: 33 / 255, alpha: 1), range: NSRange.init(location: 0, length: text.length - 1))
let textview = UITextView.init(frame: CGRectMake(0, 0, 200, 30))
textview.attributedText = text

2、我们在来考虑不允许开始的这部分文本删除的策略

这时候,我们需要用到UITextViewDelegate中的两个方法

uitextview实现开头部分文本着色及不让更改的效果_第3张图片
shouldChangeTextInRange.png

这个方法中 replacementText如果是 空字符串 "",代表正在做删除操作,此时,如果如果能够找到已经删除到了开始的那部分,返回 false的话,那么应该可以阻止开始部分文本被删除了。

3、我们在来考虑不允许开始的这部分文本增加的策略

那么是什么意思,举个,你把焦点放在了,这段文本之中,在插入的话,实际上通过之前删除策略,我们无法保证文本内容的增加,因此,我们需要这个代理方法

uitextview实现开头部分文本着色及不让更改的效果_第4张图片
textViewDidChangeSelection

那么思路又是什么呢?
首先,我们在初始化那段开始文本的时候,记录下我们的 NSRange,那么很显然,这个range就是字符串的长度这个起始位置,然后偏移0,用代码表示就是

lastSelectRange = NSRange.init(location: textLength, length: 0)

然后,在我们的输入更多文本的过程中textview的NSRange是不停的变化的,我们要更新,然而,我们还不能直接更新,要判断下,这个新的range是否触摸到了我们那部分不能动的文本区域

if textView.selectedRange.location < textLength {
       textView.selectedRange = lastSelectRange
}
lastSelectRange = textview.selectRange

总结及提问环节

至此,我们就实现了对textview的开始部分文本的着色和不允许修改的功能。

那么问题来了:

  • UItextview的attributedText 和 text 属性有什么区别,什么时候要用attributedText呢?
  • 假如让你替换一下UItextview开头的那部分文本,怎么做?
  • 假如UItextview开头的那部分文本可以删除,而且只要出发删除,就需要整体删除,你如何做?
  • 假如还要让开头的那部分文本可以向超链接可以点击,你怎么做?

以上问题的答案可以直接回复到评论中。。

你可能感兴趣的:(uitextview实现开头部分文本着色及不让更改的效果)