可以从一跟着一步一步来,你也可以完成这个Demo
在(一)的时候,完成了单个表情的显示,这里,我们将彻底完成图文混排的工作,效果如下:
代码如下
class ViewController: UIViewController {
@IBOutlet weak var testlabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let string = "我[爱你]啊!! [笑哈哈],我想[泪]了,[马上有对象]是骗人的,这是马上面有对象[哼]"
testlabel.attributedText = YWEmoticonManager.shared.emoticonString(string: string, font: testlabel.font)
}
}
经过之前的封装,我们一个方法就可以做到这种图文混排的效果了,在YWEmoticonManager单例类里添加如下方法:
/// 将给定的字符串转换成属性文本
///
/// - parameter string: 完整的字符串
///
/// - returns: 属性文本
func emoticonString(string: String,font: UIFont) -> NSAttributedString {
let attrString = NSMutableAttributedString(string: string)
//1.建立正则表达式,过滤所有的表情文字
//() [] 都是正则表达式的关键字,如果需要参与匹配,需要转义
let pattern = "\\\\[.*?\\\\]"
guard let regx = try? NSRegularExpression(pattern: pattern, options: []) else{
return attrString
}
//2.匹配所有项
let matches = regx.matches(in: string, options: [], range: NSRange(location: 0, length: attrString.length))
//3.遍历所有匹配结果
for m in matches.reversed() {
let r = m.rangeAt(0)
let subStr = (attrString.string as NSString).substring(with: r)
//使用subStr 查找对应的表情符号
if let em = YWEmoticonManager.shared.findEmoticon(string: subStr) {
//使用表情符号中的属性文本,替换原有的属性文本内容
attrString.replaceCharacters(in: r, with: em.imageText(font: font))
}
}
//4.统一设置一遍字符串的属性
attrString.addAttributes([NSFontAttributeName: font], range: NSRange(location: 0, length: attrString.length))
return attrString
}
- 注意点:在遍历正则所有的匹配项的时候,需要使用倒序,一次遍历可以吧所有的图片替换完成
例如:我[爱你]啊[笑哈哈]
range1 = {1,4}
range2 = {6,5}
顺序替换,替换前面的之后,后面的范围会失效
我[爱你的图片]啊[笑哈哈的图片]
Demo地址:https://github.com/iosyaowei/YWFace-Demo