LNUserSearchRoomCardView.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. //
  2. // LNUserSearchRoomCardView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/19.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNUserSearchRoomCardView: UIView {
  11. private let cover = UIImageView()
  12. private let bottomCover = UIImageView()
  13. private let idLabel = UILabel()
  14. private let hotIconView = UIImageView()
  15. private let hotCountLabel = UILabel()
  16. private let titleLabel = UILabel()
  17. private let subtitleLabel = UILabel()
  18. private var curItem: LNRoomItemVO?
  19. override init(frame: CGRect) {
  20. super.init(frame: frame)
  21. setupViews()
  22. }
  23. required init?(coder: NSCoder) {
  24. fatalError("init(coder:) has not been implemented")
  25. }
  26. func update(_ item: LNRoomItemVO) {
  27. idLabel.text = "ID \(item.roomId)"
  28. // hotCountLabel.text = "\(item.viewers)"
  29. cover.sd_setImage(with: URL(string: item.roomCover))
  30. titleLabel.text = item.roomTitle
  31. subtitleLabel.text = item.user.nickname
  32. curItem = item
  33. }
  34. }
  35. extension LNUserSearchRoomCardView {
  36. private func setupViews() {
  37. backgroundColor = .clear
  38. onTap { [weak self] in
  39. guard let self, let curItem else { return }
  40. pushToRoom(curItem.roomId)
  41. }
  42. cover.layer.cornerRadius = 12
  43. cover.clipsToBounds = true
  44. cover.contentMode = .scaleAspectFill
  45. addSubview(cover)
  46. cover.snp.makeConstraints { make in
  47. make.top.equalToSuperview()
  48. make.horizontalEdges.equalToSuperview()
  49. make.height.equalTo(cover.snp.width)
  50. }
  51. bottomCover.image = UIImage.generateLinearGradientImage(
  52. colors: [.clear, .black.withAlphaComponent(0.65)],
  53. size: .init(width: 10, height: 10),
  54. endPoint: .init(x: 0, y: 1)
  55. )
  56. cover.addSubview(bottomCover)
  57. bottomCover.snp.makeConstraints { make in
  58. make.horizontalEdges.equalToSuperview()
  59. make.bottom.equalToSuperview()
  60. make.height.equalTo(30)
  61. }
  62. idLabel.font = .body_xs
  63. idLabel.textColor = .text_1
  64. cover.addSubview(idLabel)
  65. idLabel.snp.makeConstraints { make in
  66. make.leading.equalToSuperview().offset(8)
  67. make.bottom.equalToSuperview().offset(-6)
  68. }
  69. hotIconView.isHidden = true
  70. hotIconView.image = UIImage(systemName: "flame.fill")?.withRenderingMode(.alwaysTemplate)
  71. hotIconView.tintColor = .white
  72. cover.addSubview(hotIconView)
  73. hotIconView.snp.makeConstraints { make in
  74. make.trailing.equalToSuperview().offset(-20)
  75. make.bottom.equalToSuperview().offset(-8)
  76. make.width.height.equalTo(10)
  77. }
  78. hotCountLabel.isHidden = true
  79. hotCountLabel.font = .body_xs
  80. hotCountLabel.textColor = .text_1
  81. cover.addSubview(hotCountLabel)
  82. hotCountLabel.snp.makeConstraints { make in
  83. make.leading.equalTo(hotIconView.snp.trailing).offset(2)
  84. make.centerY.equalTo(hotIconView)
  85. make.trailing.equalToSuperview().offset(-8)
  86. }
  87. titleLabel.font = .heading_h4
  88. titleLabel.textColor = .text_5
  89. titleLabel.numberOfLines = 1
  90. addSubview(titleLabel)
  91. titleLabel.snp.makeConstraints { make in
  92. make.leading.trailing.equalToSuperview()
  93. make.top.equalTo(cover.snp.bottom).offset(6)
  94. }
  95. subtitleLabel.font = .body_xs
  96. subtitleLabel.textColor = .text_4
  97. subtitleLabel.numberOfLines = 1
  98. addSubview(subtitleLabel)
  99. subtitleLabel.snp.makeConstraints { make in
  100. make.leading.trailing.equalToSuperview()
  101. make.top.equalTo(titleLabel.snp.bottom).offset(2)
  102. make.bottom.equalToSuperview()
  103. }
  104. }
  105. }