前篇讲完布局,这篇讲讲我卡住最久的部分,想流畅地在打字时插入自订的表情符号,一开始是有些目标错误,因为使用者有各种各自习惯的键盘,所以就一直针对个键盘的特性去拦截使用者正在打的字(使用”textView(_:shouldChangeTextIn:replacementText:)”),後来觉得这样会没完没了,改变思路找到了NSMutableAttributedString,完全能解决我的问题,所以想把这个解法好好跟大家分享一样,虽然大神们可能有更好的解法,但就让我献丑一下:)
TextField、Label、TextView都有attributedText可以选用,都可以达成图文混排的效果,但这边我的打字框和对话框全都是用TextView元件来达成。
在打字框打完字,按下送出键经由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
}
>>: Day12:今天来聊一下Parrot Security的OpenVAS
Instantiate实例化,用於将物件生成至场景中。(参考unity手册) 适合用在复制一样的物件...
笔记会纪录与已知的 Python 的差别, 或是对我来说比较需要记忆的部分。 初学 Go 不建议看这...
1. 静态型别 VS. 动态型别 1.1 静态型别的例子 以Java为例: int x 在宣告x变数...
看完第一个案例不知道大家有什麽收获?欢迎给我一些回馈哦!接着,跟大家分享第二个案例罗! 欢迎有兴趣的...
Colab连结 资料增强(Data Augmentation),是一个当今天资料集样本不多时,透过调...