LNUserSearchRoomCardView.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. addSubview(cover)
  45. cover.snp.makeConstraints { make in
  46. make.top.equalToSuperview()
  47. make.horizontalEdges.equalToSuperview()
  48. make.height.equalTo(cover.snp.width)
  49. }
  50. bottomCover.image = UIImage.generateLinearGradientImage(
  51. colors: [.clear, .black.withAlphaComponent(0.65)],
  52. size: .init(width: 10, height: 10),
  53. endPoint: .init(x: 0, y: 1)
  54. )
  55. cover.addSubview(bottomCover)
  56. bottomCover.snp.makeConstraints { make in
  57. make.horizontalEdges.equalToSuperview()
  58. make.bottom.equalToSuperview()
  59. make.height.equalTo(30)
  60. }
  61. idLabel.font = .body_xs
  62. idLabel.textColor = .text_1
  63. cover.addSubview(idLabel)
  64. idLabel.snp.makeConstraints { make in
  65. make.leading.equalToSuperview().offset(8)
  66. make.bottom.equalToSuperview().offset(-6)
  67. }
  68. hotIconView.isHidden = true
  69. hotIconView.image = UIImage(systemName: "flame.fill")?.withRenderingMode(.alwaysTemplate)
  70. hotIconView.tintColor = .white
  71. cover.addSubview(hotIconView)
  72. hotIconView.snp.makeConstraints { make in
  73. make.trailing.equalToSuperview().offset(-20)
  74. make.bottom.equalToSuperview().offset(-8)
  75. make.width.height.equalTo(10)
  76. }
  77. hotCountLabel.isHidden = true
  78. hotCountLabel.font = .body_xs
  79. hotCountLabel.textColor = .text_1
  80. cover.addSubview(hotCountLabel)
  81. hotCountLabel.snp.makeConstraints { make in
  82. make.leading.equalTo(hotIconView.snp.trailing).offset(2)
  83. make.centerY.equalTo(hotIconView)
  84. make.trailing.equalToSuperview().offset(-8)
  85. }
  86. titleLabel.font = .heading_h4
  87. titleLabel.textColor = .text_5
  88. titleLabel.numberOfLines = 1
  89. addSubview(titleLabel)
  90. titleLabel.snp.makeConstraints { make in
  91. make.leading.trailing.equalToSuperview()
  92. make.top.equalTo(cover.snp.bottom).offset(6)
  93. }
  94. subtitleLabel.font = .body_xs
  95. subtitleLabel.textColor = .text_4
  96. subtitleLabel.numberOfLines = 1
  97. addSubview(subtitleLabel)
  98. subtitleLabel.snp.makeConstraints { make in
  99. make.leading.trailing.equalToSuperview()
  100. make.top.equalTo(titleLabel.snp.bottom).offset(2)
  101. make.bottom.equalToSuperview()
  102. }
  103. }
  104. }