Swift3.0图文混排进阶(二)Demo完结篇

可以从一跟着一步一步来,你也可以完成这个Demo

Swift3.0图文混排进阶(一)数据准备

在(一)的时候,完成了单个表情的显示,这里,我们将彻底完成图文混排的工作,效果如下:

Swift3.0图文混排进阶(二)Demo完结篇_第1张图片
图文效果图.png

代码如下

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

你可能感兴趣的:(Swift3.0图文混排进阶(二)Demo完结篇)