正则查出范围---根据文字字符串创建imge--创建属性字符串(带图片的atachment)---属性字符串替换原来的表情根据位置
进入房间--离开房间---名字变色
class func GenerateEnterOrLeaveRoom(_ isEnter : Bool, _ username : String) -> NSAttributedString {
// coderwhy 进入房间
// 1.拼接完整的消息
let message = username + (isEnter ? " 进入房间" : " 离开房间")
// 2.根据String创建NSMutableAttributedString
let attrMessage = NSMutableAttributedString(string: message)
// 3.修改名字的颜色
let nameRange = NSRange(location: 0, length: username.lengthOfBytes(using: .utf8))
attrMessage.setAttributes([NSForegroundColorAttributeName : UIColor.orange], range: nameRange)
return attrMessage
}
聊天消息---带图片
步骤:正则匹配[]-->匹配出数组--->遍历数组-->取出图片字符串位置--创建图片---替换字符串中的位置
class func generateChatMessage(_ username : String, _ message : String, _ font : UIFont) -> NSAttributedString {
// 1.拼接完整的消息
let chatMessage = username + ":" + message
// 2.根据string创建NSMutableAttributedString
let chatAttrString = NSMutableAttributedString(string: chatMessage)
// 3.将名字改成特殊的颜色
let nameRange = NSRange(location: 0, length: username.lengthOfBytes(using: .utf8))
chatAttrString.setAttributes([NSForegroundColorAttributeName : UIColor.orange], range: nameRange)
// 4.I [哈哈] my [嘿嘿]is [嘻嘻]why[呵呵]
// [哈哈] --> 图片名称 --> UIImage --> NSTextAttachment -> NSAttributedString
// 4.1.使用正则表达式, 将表情对应的文字匹配出来 [1379]
let pattern = "\\[.*?\\]" .去除特殊字符 * 数量不同 ?遇到第一个就截止
guard let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) else {
return chatAttrString
}
// 4.2.匹配结果
let range = NSRange(location: 0, length: chatMessage.characters.count)
let results = regex.matches(in: chatMessage, options: [], range: range)
// 4.3.遍历所有的结果---反转遍历--证遍历range就不对了--文字替换成表情字符数不同
for i in (0.. let result = results[i] let imageName = (chatMessage as NSString).substring(with: result.range) guard let image = UIImage(named: imageName) else { continue } let attachment = NSTextAttachment() attachment.image = image attachment.bounds = CGRect(x: 0, y: -4, width: font.lineHeight, height: font.lineHeight) let imageAttrStr = NSAttributedString(attachment: attachment) // 4.8.将之前的文字, 替换成当前imageAttrStr chatAttrString.replaceCharacters(in: result.range, with: imageAttrStr) } return chatAttrString } class func generateGiftMessage(_ username : String, _ giftName : String, _ giftURL : String) -> NSAttributedString { let giftMessage = username + " 赠送给主播 " + giftName // 2.根据String创建NSMutableAttributedString let giftAttrString = NSMutableAttributedString(string: giftMessage) let nameRange = NSRange(location: 0, length: username.lengthOfBytes(using: .utf8)) giftAttrString.setAttributes([NSForegroundColorAttributeName : UIColor.orange], range: nameRange) let giftNameRange = (giftMessage as NSString).range(of: giftName) giftAttrString.setAttributes([NSForegroundColorAttributeName : UIColor.red], range: giftNameRange) guard let image = KingfisherManager.shared.cache.retrieveImageInMemoryCache(forKey: giftURL) else { return giftAttrString } let giftImageAttr = AttributeStrGenerator.getAttrStringWithImage(image, UIFont.systemFont(ofSize: 17.0)) giftAttrString.append(giftImageAttr) return giftAttrString } let attachment = NSTextAttachment() attachment.image = image attachment.bounds = CGRect(x: 0, y: -4, width: font.lineHeight, height: font.lineHeight) return NSAttributedString(attachment: attachment) }// 4.4.获取result对应的问题
// 4.5.根据imageName创建对应的UIImage对象
// 4.6.根据图片创建NSTextAttachment
// 4.7.根据NSTextAttachment创建NSAttributedString
送礼物 图文混排
// 1.拼接完整的字符串
// 3.设置名字的颜色
// 4.将礼物的名称修改成特殊颜色
// 5.根据giftURL创建UIImage对象
// 6.创建NSTextAttachment
// 7.将giftImageAttr拼接到giftAttrString
private class func getAttrStringWithImage(_ image : UIImage, _ font : UIFont) -> NSAttributedString {