聊天室(下)- 图文混排的实现

缘由:

前篇讲完布局,这篇讲讲我卡住最久的部分,想流畅地在打字时插入自订的表情符号,一开始是有些目标错误,因为使用者有各种各自习惯的键盘,所以就一直针对个键盘的特性去拦截使用者正在打的字(使用”textView(_:shouldChangeTextIn:replacementText:)”),後来觉得这样会没完没了,改变思路找到了NSMutableAttributedString,完全能解决我的问题,所以想把这个解法好好跟大家分享一样,虽然大神们可能有更好的解法,但就让我献丑一下:)
TextField、Label、TextView都有attributedText可以选用,都可以达成图文混排的效果,但这边我的打字框和对话框全都是用TextView元件来达成。
https://ithelp.ithome.com.tw/upload/images/20210908/20130757QJhWUZV8OL.png
在打字框打完字,按下送出键经由socket发送,有两个方向要去处理:
1.socket要传送的讯息
2.聊天室的显示框讯息

解决方法:

第1点socket要传送的讯息通常传纯文字就可以了,只要图片套入的图片後台对的到就ok了,所以先把讯息处理成纯文字,存成strA(String),然後再把strA处理成strB(NSMutableAttributedString)
第2点处理文字和图片的组合讯息时的逻辑是这样的(虽然好像有点笨?‍♀️,但我的确是有成功的)
首先把输入的String讯息抓出是否有”<img src=\"images/emo/”或"\" />”将其替换成否个特殊符号,然後再依特殊符号来分隔资料存成新阵列,然後用回圈筛选新阵列里有无.gif
假如有.gif就把他替换成空字串,然後再将它处理成显示app里该档名的图片加到结果阵列中
假如没有.gif就直接把它转型成NSAttributedString然後加到结果阵列中

范例代码如下


let str = “测试表情符号?” 
    /***换成app内图片*/
    func myImageStringHandle(_ str: String) -> NSMutableAttributedString {
	//separatedBy:的判断会让判断值消失,故塞了一个无法用键盘打出得值替代
        let newStr1 = str.replacingOccurrences(of: "\" />", with: "㊟")
        let newStr2 = newStr1.replacingOccurrences(of: "<img src=\"images/emo/", with: "㊟")
	//newStr2会印出”测试表情符号㊟19.gif㊟”
        let mixArr = newStr2.components(separatedBy: "㊟")
	//mixArr会印出”[“测试表情符号", "19.gif", “”]”
        let strB = NSMutableAttributedString()
        for i in 0..<mixArr.count {
            if mixArr[i].contains(".gif") {
                // 为图片 需去除.gif 後提供
                let handleStr = mixArr[i].replacingOccurrences(of: ".gif", with: "")
		//handleStr会印出”19”
                strB.append(createAttachment(handleStr))
		//strB会印出”测试表情符号{}{NSAttachment = "<NSTextAttachment: 0x7f91f15a2050>”;}”
            }
            else {
                let attrString = NSAttributedString(string: mixArr[i])
		//attrString会印出”测试表情符号{}”
                strB.append(attrString)
		//strB会印出”测试表情符号{}”
            }
        }
	//strB最终会印出”测试表情符号{}{NSAttachment = "<NSTextAttachment: 0x7f91f15a2050>”;}”
        return strB
    }

<<:  Flutter / Dart 语言

>>:  Day12:今天来聊一下Parrot Security的OpenVAS

18.unity实例化(上)(Instantiate)

Instantiate实例化,用於将物件生成至场景中。(参考unity手册) 适合用在复制一样的物件...

【Day 21】Go 基础小笔记 II(pointer / array / slice / map / struct)

笔记会纪录与已知的 Python 的差别, 或是对我来说比较需要记忆的部分。 初学 Go 不建议看这...

JavaScript学习日记 : Day2 - 动态型别+弱型别

1. 静态型别 VS. 动态型别 1.1 静态型别的例子 以Java为例: int x 在宣告x变数...

系统分析师的养成之路—案例分享(2)

看完第一个案例不知道大家有什麽收获?欢迎给我一些回馈哦!接着,跟大家分享第二个案例罗! 欢迎有兴趣的...

【13】模型套不套用资料增强 (Data Augmentation) 的比较实验

Colab连结 资料增强(Data Augmentation),是一个当今天资料集样本不多时,透过调...