swift 聊天表情emoji转译——从转译文字到聊天列表

Posted ihoudf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift 聊天表情emoji转译——从转译文字到聊天列表相关的知识,希望对你有一定的参考价值。

承接《swift 聊天表情emoji转译(一)》,  这篇文章主要实现例如:

哈哈[haha][meigui],你好啊[meigui]。

显示成:

哈哈😄🌹,你好啊🌹。

直接看代码:

 
let customEmojiArray = ["签到", "明白", "能", "赞", "1", "2",
                  "666", "比心", "送花花",  "谢谢老师",
                  "听懂了", "老师辛苦了", "讲得好",
                  "slime","laugh", "love", "tongue", "daze", "handclap", "titter", "handssors",
                  "six", "heart", "melon", "silly", "like", "dog", "expect", "flower"]


    // 解析消息 获取图文混排字符串
    // 例如:哈哈[haha][meigui],你好啊[meigui]
    // 显示成:哈哈😄🌹,你好啊🌹
    func getMsgAttrText(msg: String) -> NSMutableAttributedString 
        
        // 创建一个临时字符串
        var tempText = msg

        // 获取所有表情range
        var allRanges: [NSRange] = []
        // 在表情数组中遍历
        for str in customEmojiArray 

            // 一个表情
            let newStr = "[\\(str)]"
            // 如果字符串中包含表情,把表情位置加入到数组中,并把已经加入的替换成"#\\(str)#"。这样下次就不会遍历该表情了。
            var range = tempText.range(of: newStr)

            // 一个表情可能重复多次,把一个表情在字符串中的所有位置都找出来。
            while range != nil 
                let newRange = NSRange(range!, in: tempText)
                allRanges.append(newRange)
                tempText.replaceSubrange(range!, with: "#\\(str)#")
                range = tempText.range(of: newStr)
            
        
        
        // 如果没有表情,直接返回
        if allRanges.count == 0 
            return NSMutableAttributedString(string: msg)
        
        
        // 位置排序,allRanges中的表情位置不是按顺序加入的
        let newRanges = allRanges.sorted  range1, range2 in
            range1.location < range2.location
        
        
        // 根据位置,获取该位置的图片名字
        var imageStrs: [String] = []
        for range in newRanges 

      // 安全性判断
            if range.location >= msg.count || range.location + range.length - 1 >= msg.count || range.length < 3 
                continue
            
            let index3 = msg.index(msg.startIndex, offsetBy: range.location)
            let index4 = msg.index(msg.startIndex, offsetBy: range.location + range.length - 1)

            // 这里按顺序获取了emoji名称,例如:[haha]
            let str = msg[index3...index4]
            // 删除前后的[],只把名字加入数组。或者用removeFirst,removeLast方法
            let str1 = str.replacingOccurrences(of: "[", with: "")
            let str2 = str1.replacingOccurrences(of: "]", with: "")
            imageStrs.append(String(str2))
        
        
        // 构造图文混排字符
        let attrStr = NSMutableAttributedString(string: msg)
        
        var space = 0
        for (i, imageStr) in imageStrs.enumerated() 
            
            guard let image = UIImage(named: imageStr) else  continue 
            // 构造emoji富文本
            let imgStr = getImageAttachString(image: image)
            
            // 在图片位置上把[haha]替换成😄
            let range = newRanges[i]
            attrStr.replaceCharacters(in: NSRange(location: range.location - space, length: range.length), with: imgStr)
            
            // 原本[haha]的长度是range.length这么长,替换成😄(长度为1,或者用imgStr.length)之后,字符串长度减少了range.length - 1。所以第二个要替换文本的location是range2.location - space
            space = space + range.length - 1
        
            

        // 解析完成
        return attrStr
    
        

    // 构造图片富文本
    func getImageAttachString(image: UIImage) -> NSMutableAttributedString 
        let newH = 18.0
        let newY = roundf(Float(font.capHeight - newH))/2.0
        let newW = newH * image.size.width / image.size.height
        let attach = NSTextAttachment()
        attach.image = image
        attach.bounds = CGRect(x: 0, y: Double(newY), width: newW, height: newH)
        let imgAttrText = NSMutableAttributedString(attachment: attach)
        return imgAttrText
    
    

以上是关于swift 聊天表情emoji转译——从转译文字到聊天列表的主要内容,如果未能解决你的问题,请参考以下文章

swift 聊天表情emoji转译——从转译文字到聊天列表

swift 聊天表情emoji转译——从键盘到输入框

swift 聊天表情emoji转译——从键盘到输入框

swift 聊天表情emoji转译——从键盘到输入框

Js聊天项目-删除输入聊天的emoji表情

Swift 到 JavaScript 转译器 - 可能吗?