LNHomeActivityTabView.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. //
  2. // LNHomeActivityTabView.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/21.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. protocol LNHomeActivityTabViewDelegate: NSObject {
  11. func homeActivityTabView(view: LNHomeActivityTabView, didSelect category: LNGameCategoryItemVO?)
  12. func homeActivityTabViewClickMore(view: LNHomeActivityTabView)
  13. }
  14. class LNHomeActivityTabView: UIView {
  15. private(set) var curGame: LNGameCategoryItemVO? {
  16. didSet {
  17. guard oldValue?.code != curGame?.code else { return }
  18. tabItemViews.forEach {
  19. $0.setSelected(curGame?.code == $0.item?.code)
  20. }
  21. delegate?.homeActivityTabView(view: self, didSelect: curGame)
  22. }
  23. }
  24. private let stackView = UIStackView()
  25. private var tabItemViews: [LNHomeActivityTabItemView] = []
  26. weak var delegate: LNHomeActivityTabViewDelegate?
  27. override init(frame: CGRect) {
  28. super.init(frame: frame)
  29. setupViews()
  30. }
  31. func update(_ games: [LNGameCategoryItemVO]) {
  32. let itemViews = stackView.arrangedSubviews
  33. itemViews.forEach {
  34. stackView.removeArrangedSubview($0)
  35. $0.removeFromSuperview()
  36. }
  37. tabItemViews.removeAll()
  38. games.prefix(2).forEach { item in
  39. let itemView = LNHomeActivityTabItemView()
  40. itemView.onTap { [weak self] in
  41. guard let self else { return }
  42. if self.curGame?.code == item.code {
  43. self.curGame = nil
  44. } else {
  45. self.curGame = item
  46. }
  47. }
  48. itemView.update(item)
  49. itemView.setSelected(false)
  50. stackView.addArrangedSubview(itemView)
  51. tabItemViews.append(itemView)
  52. }
  53. }
  54. required init?(coder: NSCoder) {
  55. fatalError("init(coder:) has not been implemented")
  56. }
  57. }
  58. extension LNHomeActivityTabView {
  59. private func setupViews() {
  60. let moreView = LNHomeActivityMoreTabView()
  61. moreView.onTap { [weak self] in
  62. guard let self else { return }
  63. self.delegate?.homeActivityTabViewClickMore(view: self)
  64. }
  65. addSubview(moreView)
  66. moreView.snp.makeConstraints { make in
  67. make.centerY.equalToSuperview()
  68. make.trailing.equalToSuperview()
  69. }
  70. stackView.axis = .horizontal
  71. stackView.distribution = .fillEqually
  72. stackView.spacing = 2
  73. addSubview(stackView)
  74. stackView.snp.makeConstraints { make in
  75. make.leading.equalToSuperview()
  76. make.verticalEdges.equalToSuperview()
  77. make.trailing.equalTo(moreView.snp.leading).offset(-2)
  78. }
  79. }
  80. }
  81. #if DEBUG
  82. import SwiftUI
  83. struct LNHomeActivityTabViewPreview: UIViewRepresentable {
  84. func makeUIView(context: Context) -> some UIView {
  85. let container = UIView()
  86. container.backgroundColor = .lightGray
  87. let view = LNHomeActivityTabView()
  88. container.addSubview(view)
  89. view.snp.makeConstraints { make in
  90. make.leading.trailing.top.equalToSuperview()
  91. }
  92. return container
  93. }
  94. func updateUIView(_ uiView: UIViewType, context: Context) { }
  95. }
  96. #Preview(body: {
  97. LNHomeActivityTabViewPreview()
  98. })
  99. #endif