IMChatMessageViewCell.swift 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. //
  2. // IMChatMessageViewCell.swift
  3. // O2Platform
  4. //
  5. // Created by FancyLou on 2020/6/8.
  6. // Copyright © 2020 zoneland. All rights reserved.
  7. //
  8. import UIKit
  9. import CocoaLumberjack
  10. class IMChatMessageViewCell: UITableViewCell {
  11. @IBOutlet weak var avatarImage: UIImageView!
  12. @IBOutlet weak var titleLabel: UILabel!
  13. @IBOutlet weak var timeLabel: UILabel!
  14. @IBOutlet weak var messageBackgroundView: UIView!
  15. @IBOutlet weak var messageBackgroundWidth: NSLayoutConstraint!
  16. @IBOutlet weak var messageBackgroundHeight: NSLayoutConstraint!
  17. private let messageWidth = 176
  18. override func awakeFromNib() {
  19. super.awakeFromNib()
  20. }
  21. override func setSelected(_ selected: Bool, animated: Bool) {
  22. super.setSelected(selected, animated: animated)
  23. }
  24. //普通通知消息
  25. func setInstantContent(item: InstantMessage) {
  26. if let time = item.createTime {
  27. let date = time.toDate(formatter: "yyyy-MM-dd HH:mm:ss")
  28. self.timeLabel.text = date.friendlyTime()
  29. }
  30. if let msg = item.title {
  31. textMsgRender(msg: msg)
  32. }
  33. if let type = item.type {
  34. if type.starts(with: "task_") {
  35. self.avatarImage.image = UIImage(named: "icon_daiban")
  36. self.titleLabel.text = "待办消息"
  37. }else if type.starts(with: "taskCompleted_") {
  38. self.avatarImage.image = UIImage(named: "icon_taskcompleted")
  39. self.titleLabel.text = "已办消息"
  40. }else if type.starts(with: "read_") {
  41. self.avatarImage.image = UIImage(named: "icon_read")
  42. self.titleLabel.text = "待阅消息"
  43. }else if type.starts(with: "readCompleted_") {
  44. self.avatarImage.image = UIImage(named: "icon_readcompleted")
  45. self.titleLabel.text = "已阅消息"
  46. }else if type.starts(with: "review_") || type.starts(with: "work_") || type.starts(with: "process_") {
  47. self.avatarImage.image = UIImage(named: "icon_daiban")
  48. self.titleLabel.text = "工作消息"
  49. }else if type.starts(with: "meeting_") {
  50. self.avatarImage.image = UIImage(named: "icon_meeting")
  51. self.titleLabel.text = "会议消息"
  52. }else if type.starts(with: "attachment_") {
  53. self.avatarImage.image = UIImage(named: "icon_yunpan")
  54. self.titleLabel.text = "云盘消息"
  55. }else if type.starts(with: "calendar_") {
  56. self.avatarImage.image = UIImage(named: "icon_calendar")
  57. self.titleLabel.text = "日历消息"
  58. }else if type.starts(with: "cms_") {
  59. self.avatarImage.image = UIImage(named: "icon_cms")
  60. self.titleLabel.text = "信息中心消息"
  61. }else if type.starts(with: "bbs_") {
  62. self.avatarImage.image = UIImage(named: "icon_bbs")
  63. self.titleLabel.text = "论坛消息"
  64. }else if type.starts(with: "mind_") {
  65. self.avatarImage.image = UIImage(named: "icon_mindMap")
  66. self.titleLabel.text = "脑图消息"
  67. }else {
  68. self.avatarImage.image = UIImage(named: "icon_email")
  69. self.titleLabel.text = "其他消息"
  70. }
  71. }
  72. }
  73. //聊天消息
  74. func setContent(item: IMMessageInfo) {
  75. //time
  76. if let time = item.createTime {
  77. let date = time.toDate(formatter: "yyyy-MM-dd HH:mm:ss")
  78. self.timeLabel.text = date.friendlyTime()
  79. }
  80. //name avatart
  81. if let person = item.createPerson {
  82. let urlstr = AppDelegate.o2Collect.generateURLWithAppContextKey(ContactContext.contactsContextKeyV2, query: ContactContext.personIconByNameQueryV2, parameter: ["##name##":person as AnyObject], generateTime: false)
  83. if let u = URL(string: urlstr!) {
  84. self.avatarImage.hnk_setImageFromURL(u)
  85. }else {
  86. self.avatarImage.image = UIImage(named: "icon_men")
  87. }
  88. //姓名
  89. self.titleLabel.text = person.split("@").first ?? ""
  90. }else {
  91. self.avatarImage.image = UIImage(named: "icon_men")
  92. self.titleLabel.text = ""
  93. }
  94. self.messageBackgroundView.removeSubviews()
  95. if let jsonBody = item.body, let body = parseJson(msg: jsonBody) {
  96. if body.type == o2_im_msg_type_emoji {
  97. emojiMsgRender(emoji: body.body!)
  98. }else {
  99. textMsgRender(msg: body.body!)
  100. }
  101. }
  102. }
  103. private func emojiMsgRender(emoji: String) {
  104. let emojiSize = 36
  105. let width = CGFloat(emojiSize + 20)
  106. let height = CGFloat(emojiSize + 20)
  107. self.messageBackgroundWidth.constant = width
  108. self.messageBackgroundHeight.constant = height
  109. //背景图片
  110. let bgImg = UIImageView(frame: CGRect(x: 0, y: 0, width: width, height: height))
  111. let insets = UIEdgeInsets(top: 28, left: 10, bottom: 5, right: 5); // 上、左、下、右
  112. var bubble = UIImage(named: "chat_bubble_incomming")
  113. bubble = bubble?.resizableImage(withCapInsets: insets, resizingMode: .stretch)
  114. bgImg.image = bubble
  115. self.messageBackgroundView.addSubview(bgImg)
  116. //表情图
  117. let emojiImage = UIImageView(frame: CGRect(x: 0, y: 0, width: emojiSize, height: emojiSize))
  118. let bundle = Bundle().o2EmojiBundle(anyClass: IMChatMessageViewCell.self)
  119. let path = o2ImEmojiPath(emojiBody: emoji)
  120. emojiImage.image = UIImage(named: path, in: bundle, compatibleWith: nil)
  121. emojiImage.translatesAutoresizingMaskIntoConstraints = false
  122. self.messageBackgroundView.addSubview(emojiImage)
  123. let top = NSLayoutConstraint(item: emojiImage, attribute: .top, relatedBy: .equal, toItem: emojiImage.superview!, attribute: .top, multiplier: 1, constant: 10)
  124. let bottom = NSLayoutConstraint(item: emojiImage.superview! , attribute: .bottom, relatedBy: .equal, toItem: emojiImage, attribute: .bottom, multiplier: 1, constant: 10)
  125. let left = NSLayoutConstraint(item: emojiImage, attribute: .leading, relatedBy: .equal, toItem: emojiImage.superview!, attribute: .leading, multiplier: 1, constant: 10)
  126. let right = NSLayoutConstraint(item: emojiImage.superview!, attribute: .trailing, relatedBy: .equal, toItem: emojiImage, attribute: .trailing, multiplier: 1, constant: 10)
  127. NSLayoutConstraint.activate([top, bottom, left, right])
  128. }
  129. private func textMsgRender(msg: String) {
  130. let size = calTextSize(str: msg)
  131. self.messageBackgroundWidth.constant = size.width + 20
  132. self.messageBackgroundHeight.constant = size.height + 20
  133. //背景图片
  134. let bgImg = UIImageView(frame: CGRect(x: 0, y: 0, width: size.width + 20, height: size.height + 20))
  135. let insets = UIEdgeInsets(top: 28, left: 10, bottom: 5, right: 5); // 上、左、下、右
  136. var bubble = UIImage(named: "chat_bubble_incomming")
  137. bubble = bubble?.resizableImage(withCapInsets: insets, resizingMode: .stretch)
  138. bgImg.image = bubble
  139. self.messageBackgroundView.addSubview(bgImg)
  140. //文字
  141. let label = generateMessagelabel(str: msg, size: size)
  142. label.translatesAutoresizingMaskIntoConstraints = false
  143. self.messageBackgroundView.addSubview(label)
  144. let top = NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: label.superview!, attribute: .top, multiplier: 1, constant: 10)
  145. let left = NSLayoutConstraint(item: label, attribute: .leading, relatedBy: .equal, toItem: label.superview!, attribute: .leading, multiplier: 1, constant: 10)
  146. let right = NSLayoutConstraint(item: label.superview!, attribute: .trailing, relatedBy: .equal, toItem: label, attribute: .trailing, multiplier: 1, constant: 10)
  147. NSLayoutConstraint.activate([top, left, right])
  148. }
  149. private func generateMessagelabel(str: String, size: CGSize) -> UILabel {
  150. let label = UILabel(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height))
  151. label.text = str
  152. label.font = UIFont.systemFont(ofSize: 16)
  153. label.numberOfLines = 0
  154. label.lineBreakMode = .byCharWrapping
  155. label.preferredMaxLayoutWidth = size.width
  156. return label
  157. }
  158. private func calTextSize(str: String) -> CGSize {
  159. let size = CGSize(width: messageWidth.toCGFloat, height: CGFloat(MAXFLOAT))
  160. return str.boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16)], context: nil).size
  161. }
  162. //解析json为消息对象
  163. private func parseJson(msg: String) -> IMMessageBodyInfo? {
  164. return IMMessageBodyInfo.deserialize(from: msg)
  165. }
  166. }