LNIMOfficialMessageCell.swift 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //
  2. // LNIMOfficialMessageCell.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/11.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. import AutoCodable
  11. class LNIMOfficialMessageCell: UITableViewCell {
  12. private let topCover = UIImageView()
  13. private let titleLabel = UILabel()
  14. private let descLabel = UILabel()
  15. private let jumpView = UIView()
  16. private var curItem: LNIMOfficialMessage?
  17. override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  18. super.init(style: style, reuseIdentifier: reuseIdentifier)
  19. setupViews()
  20. }
  21. required init?(coder: NSCoder) {
  22. fatalError("init(coder:) has not been implemented")
  23. }
  24. func update(_ data: LNIMOfficialMessage) {
  25. topCover.isHidden = data.image.isEmpty
  26. topCover.sd_setImage(with: URL(string: data.image))
  27. titleLabel.text = data.title
  28. descLabel.text = data.content
  29. jumpView.isHidden = data.link.isEmpty
  30. curItem = data
  31. }
  32. }
  33. extension LNIMOfficialMessageCell {
  34. private func setupViews() {
  35. backgroundColor = .clear
  36. let container = UIView()
  37. container.layer.cornerRadius = 12
  38. container.clipsToBounds = true
  39. container.backgroundColor = .fill
  40. contentView.addSubview(container)
  41. container.snp.makeConstraints { make in
  42. make.horizontalEdges.equalToSuperview().inset(16)
  43. make.top.equalToSuperview()
  44. make.bottom.equalToSuperview().offset(-10)
  45. }
  46. let stackView = UIStackView()
  47. stackView.axis = .vertical
  48. container.addSubview(stackView)
  49. stackView.snp.makeConstraints { make in
  50. make.horizontalEdges.equalToSuperview()
  51. make.top.equalToSuperview()
  52. make.bottom.equalToSuperview().offset(-12)
  53. }
  54. topCover.contentMode = .scaleAspectFill
  55. topCover.clipsToBounds = true
  56. stackView.addArrangedSubview(topCover)
  57. topCover.snp.makeConstraints { make in
  58. make.horizontalEdges.equalToSuperview()
  59. make.height.equalTo(topCover.snp.width).multipliedBy(130.0/343)
  60. }
  61. stackView.addArrangedSubview(buildTitleView())
  62. stackView.addArrangedSubview(buildJumpView())
  63. }
  64. private func buildTitleView() -> UIView {
  65. let container = UIView()
  66. titleLabel.font = .heading_h4
  67. titleLabel.textColor = .text_5
  68. titleLabel.numberOfLines = 0
  69. container.addSubview(titleLabel)
  70. titleLabel.snp.makeConstraints { make in
  71. make.horizontalEdges.equalToSuperview().inset(12)
  72. make.top.equalToSuperview().offset(12)
  73. }
  74. descLabel.font = .body_s
  75. descLabel.textColor = .text_3
  76. descLabel.numberOfLines = 0
  77. container.addSubview(descLabel)
  78. descLabel.snp.makeConstraints { make in
  79. make.horizontalEdges.equalToSuperview().inset(12)
  80. make.top.equalTo(titleLabel.snp.bottom).offset(6)
  81. make.bottom.equalToSuperview()
  82. }
  83. return container
  84. }
  85. private func buildJumpView() -> UIView {
  86. jumpView.onTap { [weak self] in
  87. guard let self else { return }
  88. guard let url = curItem?.link, !url.isEmpty else { return }
  89. pushToWebView(.init(url: url))
  90. }
  91. let line = UIView()
  92. line.backgroundColor = .fill_2
  93. jumpView.addSubview(line)
  94. line.snp.makeConstraints { make in
  95. make.horizontalEdges.equalToSuperview().inset(12)
  96. make.top.equalToSuperview().offset(6)
  97. make.height.equalTo(0.5)
  98. }
  99. let jumpTitle = UILabel()
  100. jumpTitle.text = .init(key: "A00098")
  101. jumpTitle.font = .heading_h4
  102. jumpTitle.textColor = .text_6
  103. jumpView.addSubview(jumpTitle)
  104. jumpTitle.snp.makeConstraints { make in
  105. make.top.equalTo(line.snp.bottom).offset(6)
  106. make.leading.equalToSuperview().offset(12)
  107. make.bottom.equalToSuperview()
  108. }
  109. let arrow = UIImageView.arrowImageView(size: 14)
  110. arrow.tintColor = .text_4
  111. jumpView.addSubview(arrow)
  112. arrow.snp.makeConstraints { make in
  113. make.centerY.equalTo(jumpTitle)
  114. make.trailing.equalToSuperview().offset(-12)
  115. }
  116. return jumpView
  117. }
  118. }