TSTextMessageContentCell.swift 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // CustomTextMessageContentCell.swift
  3. // ChatExample
  4. //
  5. // Created by Vignesh J on 01/05/21.
  6. // Copyright © 2021 MessageKit. All rights reserved.
  7. //
  8. import MessageKit
  9. import UIKit
  10. import SwiftyMarkdown
  11. class TSTextMessageContentCell: TSMessageContentCell {
  12. var messageLabel: UILabel = {
  13. let label = UILabel.createLabel(font: .font(size: 16),numberOfLines: 0)
  14. label.lineBreakMode = .byWordWrapping
  15. return label
  16. }()
  17. lazy var activityIndicator: UIActivityIndicatorView = {
  18. activityIndicator = UIActivityIndicatorView(style: .medium)
  19. activityIndicator.color = .white
  20. activityIndicator.isHidden = true
  21. return activityIndicator
  22. }()
  23. lazy var refreshBtn: UIButton = {
  24. let refresh = UIButton.createButton(image: UIImage(named: "aichat_refresh")) { [weak self] in
  25. guard let self = self else { return }
  26. }
  27. return refresh
  28. }()
  29. lazy var bottomToolView: UIView = {
  30. bottomToolView = UIView()
  31. bottomToolView.isHidden = true
  32. return bottomToolView
  33. }()
  34. override func prepareForReuse() {
  35. super.prepareForReuse()
  36. }
  37. override func setupSubviews() {
  38. super.setupSubviews()
  39. let labelEdge = TSTextLayoutSizeCalculator.cellMessagelabelEdge
  40. messageContainerView.addSubview(messageLabel)
  41. messageLabel.snp.makeConstraints { make in
  42. make.edges.equalTo(labelEdge)
  43. make.width.lessThanOrEqualTo(300) // 设置最大宽度为 300
  44. make.width.greaterThanOrEqualTo(24.0)
  45. make.height.greaterThanOrEqualTo(24.0)
  46. }
  47. messageContainerView.addSubview(activityIndicator)
  48. activityIndicator.snp.makeConstraints { make in
  49. make.top.equalTo(12)
  50. make.left.equalTo(12)
  51. make.width.height.equalTo(24.0)
  52. }
  53. bottomToolView.addSubview(refreshBtn)
  54. refreshBtn.snp.makeConstraints { make in
  55. make.left.equalTo(12)
  56. make.bottom.equalTo(-9)
  57. make.width.height.equalTo(20)
  58. }
  59. }
  60. override func configure(
  61. with message: MessageType,
  62. at indexPath: IndexPath,
  63. in messagesCollectionView: MessagesCollectionView,
  64. dataSource: MessagesDataSource,
  65. and sizeCalculator: TSLayoutSizeCalculator)
  66. {
  67. super.configure(with: message, at: indexPath, in: messagesCollectionView, dataSource: dataSource, and: sizeCalculator)
  68. guard let displayDelegate = messagesCollectionView.messagesDisplayDelegate else {
  69. return
  70. }
  71. //更新frame
  72. let calculator = sizeCalculator as? TSTextLayoutSizeCalculator
  73. //全面控制 label size
  74. // let labelFrame = calculator?.messageLabelSize(for: message, at: indexPath,fromCurrentSender: dataSource.isFromCurrentSender(message: message)) ?? TSTextLayoutSizeCalculator.cellMessagelabelMinSize
  75. // messageLabel.snp.updateConstraints { make in
  76. // make.width.equalTo(labelFrame.width)
  77. // make.height.equalTo(labelFrame.height)
  78. // }
  79. //label 高度自适应
  80. let maxWidth = calculator?.cellMessagelabelMaxWidth(fromCurrentSender: dataSource.isFromCurrentSender(message: message)) ?? TSTextLayoutSizeCalculator.cellMessagelabelMinSize.width
  81. messageLabel.snp.updateConstraints { make in
  82. make.width.lessThanOrEqualTo(maxWidth)
  83. }
  84. if let msgModel = message as? TSChatMessage {
  85. //显示旋转的动画
  86. switch msgModel.sendState {
  87. case .start:
  88. startAnimating()
  89. case .progress(_):
  90. stopAnimating()
  91. case .success(_):
  92. stopAnimating()
  93. case .failed(_):
  94. stopAnimating()
  95. default:
  96. stopAnimating()
  97. }
  98. }
  99. //给 label 赋值
  100. let textMessageKind = message.kind
  101. switch textMessageKind {
  102. case .text(let text), .emoji(let text):
  103. let textColor = displayDelegate.textColor(for: message, at: indexPath, in: messagesCollectionView)
  104. messageLabel.textColor = textColor
  105. messageLabel.text = text
  106. // debugPrint("text赋值")
  107. case .attributedText(let text):
  108. messageLabel.text = text.string
  109. messageLabel.attributedText = text
  110. // debugPrint("attributedText赋值")
  111. default:
  112. break
  113. }
  114. }
  115. func startAnimating() {
  116. activityIndicator.isHidden = false
  117. activityIndicator.startAnimating()
  118. }
  119. func stopAnimating() {
  120. activityIndicator.isHidden = true
  121. activityIndicator.stopAnimating()
  122. }
  123. }