前言
最近在做基于UITextView的富文本编辑功能,遇到了不少的坑,总感觉起来呢有以下几点:
- 当字符串中含有Unicode编码时,直接获取的range不对
- 在中英文混合的情况下,遍历字符串会不连续
- 富文本中的选择、删除处理
- 富文本中的链接点击处理
正文
range不对
场景
在富文本中有时候需要高亮文本,但是遇到了文本只有部分高亮的问题,代码如下:
1 | let string = "🔴1🔴2🔴3内部文档1" |
效果:
上面的代码看起来是没有问题的,既然颜色值没有全部生效,那么问题一个是出在了rang上。通过查资料发现,在swift中使用了扩展字型集群,所以swift中会对可以组合在一起的两个字符,以下为示例:
1 | let precomposed: Character = "\u{D55C}" // 한 |
运行结果:
1 | string:ᄒ count:1 |
可以看出虽然上面的string已经append了三个character,但是count任然是1。那么我们应该怎么样做呢?主要有以下两种办法:
- string as NSString
- range convert to NSRange
示例代码如下:
1 | let string = "🔴1🔴2🔴3内部文档1" |
运行结果:
1 | NSString length: 14 |
参考资料
https://stackoverflow.com/questions/25138339/nsrange-to-rangestring-index/30404532#30404532