TSTextMessageContentCell.swift 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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.height.equalTo(0)
  44. }
  45. messageContainerView.addSubview(activityIndicator)
  46. activityIndicator.snp.makeConstraints { make in
  47. make.top.equalTo(12)
  48. make.left.equalTo(12)
  49. make.width.height.equalTo(24.0)
  50. }
  51. bottomToolView.addSubview(refreshBtn)
  52. refreshBtn.snp.makeConstraints { make in
  53. make.left.equalTo(12)
  54. make.bottom.equalTo(-9)
  55. make.width.height.equalTo(20)
  56. }
  57. }
  58. override func configure(
  59. with message: MessageType,
  60. at indexPath: IndexPath,
  61. in messagesCollectionView: MessagesCollectionView,
  62. dataSource: MessagesDataSource,
  63. and sizeCalculator: TSLayoutSizeCalculator)
  64. {
  65. super.configure(with: message, at: indexPath, in: messagesCollectionView, dataSource: dataSource, and: sizeCalculator)
  66. guard let displayDelegate = messagesCollectionView.messagesDisplayDelegate else {
  67. return
  68. }
  69. //更新frame
  70. let calculator = sizeCalculator as? TSTextLayoutSizeCalculator
  71. let labelFrame = calculator?.messageLabelSize(for: message, at: indexPath,fromCurrentSender: dataSource.isFromCurrentSender(message: message)) ?? TSTextLayoutSizeCalculator.cellMessagelabelMinSize
  72. messageLabel.snp.updateConstraints { make in
  73. make.width.equalTo(labelFrame.width)
  74. make.height.equalTo(labelFrame.height)
  75. }
  76. if let msgModel = message as? TSChatMessage {
  77. //显示旋转的动画
  78. switch msgModel.sendState {
  79. case .start:
  80. startAnimating()
  81. case .progress(_):
  82. stopAnimating()
  83. case .success(_):
  84. stopAnimating()
  85. case .failed(_):
  86. stopAnimating()
  87. default:
  88. stopAnimating()
  89. }
  90. }
  91. //给 label 赋值
  92. let textMessageKind = message.kind
  93. switch textMessageKind {
  94. case .text(let text), .emoji(let text):
  95. let textColor = displayDelegate.textColor(for: message, at: indexPath, in: messagesCollectionView)
  96. messageLabel.textColor = textColor
  97. messageLabel.text = text
  98. // debugPrint("text赋值")
  99. case .attributedText(let text):
  100. messageLabel.text = text.string
  101. messageLabel.attributedText = text
  102. // debugPrint("attributedText赋值")
  103. // extractAndPrintSubstring(from: messageLabel.text ?? "", to: text.string)
  104. default:
  105. break
  106. }
  107. }
  108. func extractAndPrintSubstring(from sourceString: String, to targetString: String) {
  109. // 查找 sourceString 在 targetString 中的结束位置
  110. if let range = targetString.range(of: sourceString) {
  111. // 获取 sourceString 在 targetString 中的结束位置
  112. let startIdx = range.upperBound
  113. // 提取从该位置到 targetString 结束的子字符串
  114. let extractedSubstring = targetString[startIdx...]
  115. // 将提取的子字符串逐个字符输出
  116. var string = sourceString
  117. for character in extractedSubstring {
  118. // print(character)
  119. string = string + String(character)
  120. messageLabel.text = string
  121. messageLabel.attributedText = kMDAttributedString(text: string)
  122. }
  123. } else {
  124. print("未找到 sourceString")
  125. messageLabel.text = targetString
  126. messageLabel.attributedText = kMDAttributedString(text: targetString)
  127. }
  128. }
  129. func startAnimating() {
  130. activityIndicator.isHidden = false
  131. activityIndicator.startAnimating()
  132. }
  133. func stopAnimating() {
  134. activityIndicator.isHidden = true
  135. activityIndicator.stopAnimating()
  136. }
  137. }