实现思路
1、如何对部分文本着色
我们可以参考一下uitextview的这个属性
利用这个属性,我们可以对特定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中的两个方法
这个方法中
replacementText
如果是空字符串 ""
,代表正在做删除操作,此时,如果如果能够找到已经删除到了开始的那部分,返回false
的话,那么应该可以阻止开始部分文本被删除了。
3、我们在来考虑不允许开始的这部分文本增加的策略
那么是什么意思,举个🌰,你把焦点放在了,这段文本之中,在插入的话,实际上通过之前删除策略,我们无法保证文本内容的增加,因此,我们需要这个代理方法
那么思路又是什么呢?
首先,我们在初始化那段开始文本的时候,记录下我们的
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开头的那部分文本可以删除,而且只要出发删除,就需要整体删除,你如何做?
- 假如还要让开头的那部分文本可以向超链接可以点击,你怎么做?
以上问题的答案可以直接回复到评论中。。