IMChatMessageSendViewCell.swift 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //
  2. // IMChatMessageSendViewCell.swift
  3. // O2Platform
  4. //
  5. // Created by FancyLou on 2020/6/10.
  6. // Copyright © 2020 zoneland. All rights reserved.
  7. //
  8. import UIKit
  9. class IMChatMessageSendViewCell: UITableViewCell {
  10. @IBOutlet weak var timeLabel: UILabel!
  11. @IBOutlet weak var avatarImageView: UIImageView!
  12. @IBOutlet weak var nameLabel: UILabel!
  13. @IBOutlet weak var messageBackgroundView: UIView!
  14. @IBOutlet weak var messageBgWidth: NSLayoutConstraint!
  15. @IBOutlet weak var messageBgHeight: NSLayoutConstraint!
  16. override func awakeFromNib() {
  17. super.awakeFromNib()
  18. }
  19. override func setSelected(_ selected: Bool, animated: Bool) {
  20. super.setSelected(selected, animated: animated)
  21. }
  22. func setContent(item: IMMessageInfo) {
  23. //time
  24. if let time = item.createTime {
  25. let date = time.toDate(formatter: "yyyy-MM-dd HH:mm:ss")
  26. self.timeLabel.text = date.friendlyTime()
  27. }
  28. //name avatart
  29. if let person = item.createPerson {
  30. let urlstr = AppDelegate.o2Collect.generateURLWithAppContextKey(ContactContext.contactsContextKeyV2, query: ContactContext.personIconByNameQueryV2, parameter: ["##name##":person as AnyObject], generateTime: false)
  31. if let u = URL(string: urlstr!) {
  32. self.avatarImageView.hnk_setImageFromURL(u)
  33. }else {
  34. self.avatarImageView.image = UIImage(named: "icon_men")
  35. }
  36. //姓名
  37. self.nameLabel.text = person.split("@").first ?? ""
  38. }else {
  39. self.avatarImageView.image = UIImage(named: "icon_men")
  40. self.nameLabel.text = ""
  41. }
  42. self.messageBackgroundView.removeSubviews()
  43. if let jsonBody = item.body, let body = parseJson(msg: jsonBody) {
  44. if body.type == o2_im_msg_type_emoji {
  45. emojiMsgRender(emoji: body.body!)
  46. }else {
  47. textMsgRender(msg: body.body!)
  48. }
  49. }
  50. }
  51. private func emojiMsgRender(emoji: String) {
  52. let emojiSize = 36
  53. let width = CGFloat(emojiSize + 20)
  54. let height = CGFloat(emojiSize + 20)
  55. self.messageBgWidth.constant = width
  56. self.messageBgHeight.constant = height
  57. //背景图片
  58. let bgImg = UIImageView(frame: CGRect(x: 0, y: 0, width: width, height: height))
  59. let insets = UIEdgeInsets(top: 28, left: 5, bottom: 5, right: 10); // 上、左、下、右
  60. var bubble = UIImage(named: "chat_bubble_outgoing")
  61. bubble = bubble?.resizableImage(withCapInsets: insets, resizingMode: .stretch)
  62. bgImg.image = bubble
  63. self.messageBackgroundView.addSubview(bgImg)
  64. //表情图
  65. let emojiImage = UIImageView(frame: CGRect(x: 0, y: 0, width: emojiSize, height: emojiSize))
  66. let bundle = Bundle().o2EmojiBundle(anyClass: IMChatMessageSendViewCell.self)
  67. let path = o2ImEmojiPath(emojiBody: emoji)
  68. emojiImage.image = UIImage(named: path, in: bundle, compatibleWith: nil)
  69. emojiImage.translatesAutoresizingMaskIntoConstraints = false
  70. self.messageBackgroundView.addSubview(emojiImage)
  71. let top = NSLayoutConstraint(item: emojiImage, attribute: .top, relatedBy: .equal, toItem: emojiImage.superview!, attribute: .top, multiplier: 1, constant: 10)
  72. let bottom = NSLayoutConstraint(item: emojiImage.superview! , attribute: .bottom, relatedBy: .equal, toItem: emojiImage, attribute: .bottom, multiplier: 1, constant: 10)
  73. let left = NSLayoutConstraint(item: emojiImage, attribute: .leading, relatedBy: .equal, toItem: emojiImage.superview!, attribute: .leading, multiplier: 1, constant: 10)
  74. let right = NSLayoutConstraint(item: emojiImage.superview!, attribute: .trailing, relatedBy: .equal, toItem: emojiImage, attribute: .trailing, multiplier: 1, constant: 10)
  75. NSLayoutConstraint.activate([top, bottom, left, right])
  76. }
  77. private func textMsgRender(msg: String) {
  78. let size = calTextSize(str: msg)
  79. self.messageBgWidth.constant = size.width + 20
  80. self.messageBgHeight.constant = size.height + 20
  81. //背景图片
  82. let bgImg = UIImageView(frame: CGRect(x: 0, y: 0, width: size.width + 20, height: size.height + 20))
  83. let insets = UIEdgeInsets(top: 28, left: 5, bottom: 5, right: 10); // 上、左、下、右
  84. var bubble = UIImage(named: "chat_bubble_outgoing")
  85. bubble = bubble?.resizableImage(withCapInsets: insets, resizingMode: .stretch)
  86. bgImg.image = bubble
  87. self.messageBackgroundView.addSubview(bgImg)
  88. //文字
  89. let label = generateMessagelabel(str: msg, size: size)
  90. label.translatesAutoresizingMaskIntoConstraints = false
  91. self.messageBackgroundView.addSubview(label)
  92. let top = NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: label.superview!, attribute: .top, multiplier: 1, constant: 10)
  93. let left = NSLayoutConstraint(item: label, attribute: .leading, relatedBy: .equal, toItem: label.superview!, attribute: .leading, multiplier: 1, constant: 10)
  94. let right = NSLayoutConstraint(item: label.superview!, attribute: .trailing, relatedBy: .equal, toItem: label, attribute: .trailing, multiplier: 1, constant: 10)
  95. NSLayoutConstraint.activate([top, left, right])
  96. }
  97. private func generateMessagelabel(str: String, size: CGSize) -> UILabel {
  98. let label = UILabel(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height))
  99. label.text = str
  100. label.font = UIFont.systemFont(ofSize: 16)
  101. label.numberOfLines = 0
  102. label.lineBreakMode = .byCharWrapping
  103. label.preferredMaxLayoutWidth = size.width
  104. return label
  105. }
  106. private func calTextSize(str: String) -> CGSize {
  107. let size = CGSize(width: 176, height: CGFloat(MAXFLOAT))
  108. return str.boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16)], context: nil).size
  109. }
  110. //解析json为消息对象
  111. private func parseJson(msg: String) -> IMMessageBodyInfo? {
  112. return IMMessageBodyInfo.deserialize(from: msg)
  113. }
  114. }