LNVisitorItemCell.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. //
  2. // LNVisitorItemCell.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/12.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNVisitorItemCell: UITableViewCell {
  11. private let avatar = UIImageView()
  12. private let onlineView = LNOnlineView()
  13. private let nameLabel = UILabel()
  14. private let genderView = LNGenderView()
  15. private let visitTimeLabel = UILabel()
  16. private let descLabel = UILabel()
  17. private var curItem: LNVisitorItemVO?
  18. override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  19. super.init(style: style, reuseIdentifier: reuseIdentifier)
  20. setupViews()
  21. LNEventDeliver.addObserver(self)
  22. }
  23. func update(_ item: LNVisitorItemVO) {
  24. avatar.showAvatar(item.avatar)
  25. onlineView.isHidden = !item.online
  26. nameLabel.text = item.nickname
  27. // visitTimeLabel.text = Double(item.visitTime).tencentIMTimeDesc
  28. // visitTimeLabel.isHidden = item.visitTime == 0
  29. visitTimeLabel.isHidden = true
  30. genderView.update(item.gender, item.age)
  31. curItem = item
  32. }
  33. required init?(coder: NSCoder) {
  34. fatalError("init(coder:) has not been implemented")
  35. }
  36. }
  37. extension LNVisitorItemCell {
  38. private func setupViews() {
  39. backgroundColor = .clear
  40. avatar.layer.cornerRadius = 20
  41. avatar.clipsToBounds = true
  42. contentView.addSubview(avatar)
  43. avatar.snp.makeConstraints { make in
  44. make.width.height.equalTo(40)
  45. make.leading.equalToSuperview().offset(21)
  46. make.top.equalToSuperview().offset(5)
  47. make.bottom.equalToSuperview().offset(-25)
  48. }
  49. onlineView.offset = 5
  50. contentView.addSubview(onlineView)
  51. onlineView.snp.makeConstraints { make in
  52. make.edges.equalTo(avatar).inset(-2)
  53. }
  54. let tips = buildTipsView()
  55. contentView.addSubview(tips)
  56. tips.snp.makeConstraints { make in
  57. make.centerY.equalToSuperview()
  58. make.trailing.equalToSuperview().offset(-16)
  59. }
  60. let infoView = buildInfoView()
  61. contentView.addSubview(infoView)
  62. infoView.snp.makeConstraints { make in
  63. make.leading.equalTo(avatar.snp.trailing).offset(13)
  64. make.centerY.equalTo(avatar)
  65. make.trailing.equalTo(tips.snp.leading).offset(-12)
  66. }
  67. contentView.onTap { [weak self] in
  68. guard let self else { return }
  69. guard let curItem else { return }
  70. pushToProfile(uid: curItem.userNO, scene: .visitor)
  71. }
  72. }
  73. private func buildInfoView() -> UIView {
  74. let stackView = UIStackView()
  75. stackView.axis = .vertical
  76. stackView.spacing = 4
  77. stackView.addArrangedSubview(buildNameView())
  78. stackView.addArrangedSubview(buildDescView())
  79. return stackView
  80. }
  81. private func buildNameView() -> UIView {
  82. let container = UIView()
  83. nameLabel.font = .heading_h4
  84. nameLabel.textColor = .text_5
  85. container.addSubview(nameLabel)
  86. nameLabel.snp.makeConstraints { make in
  87. make.leading.equalToSuperview()
  88. make.verticalEdges.equalToSuperview()
  89. }
  90. container.addSubview(genderView)
  91. genderView.snp.makeConstraints { make in
  92. make.leading.equalTo(nameLabel.snp.trailing).offset(4)
  93. make.centerY.equalToSuperview()
  94. make.trailing.lessThanOrEqualToSuperview()
  95. }
  96. return container
  97. }
  98. private func buildDescView() -> UIView {
  99. visitTimeLabel.isHidden = true
  100. visitTimeLabel.font = .body_xs
  101. visitTimeLabel.textColor = .text_3
  102. return visitTimeLabel
  103. }
  104. private func buildTipsView() -> UIView {
  105. descLabel.text = .init(key: "B00092")
  106. descLabel.font = .body_xs
  107. descLabel.textColor = .text_4
  108. descLabel.setContentHuggingPriority(.required, for: .horizontal)
  109. descLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
  110. return descLabel
  111. }
  112. }