LNMateAdBannerCell.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //
  2. // LNMateAdBannerCell.swift
  3. // Lanu
  4. //
  5. // Created by Codex on 2026/4/8.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. final class LNMateAdBannerCell: UITableViewCell {
  11. var onTapBanner: ((_ item: LNBannerInfoVO, _ index: Int) -> Void)?
  12. private let pagerView = LNCyclePager()
  13. private let pageControl = LNCyclePageControl()
  14. private var items: [LNBannerInfoVO] = []
  15. override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  16. super.init(style: style, reuseIdentifier: reuseIdentifier)
  17. setupViews()
  18. setupPager()
  19. }
  20. required init?(coder: NSCoder) {
  21. fatalError("init(coder:) has not been implemented")
  22. }
  23. func update(items: [LNBannerInfoVO]) {
  24. self.items = items
  25. pageControl.numberOfPages = items.count
  26. pageControl.currentPage = 0
  27. pageControl.isHidden = items.count <= 1
  28. pagerView.reloadData()
  29. }
  30. }
  31. private extension LNMateAdBannerCell {
  32. func setupViews() {
  33. backgroundColor = .clear
  34. selectionStyle = .none
  35. contentView.layer.masksToBounds = true
  36. contentView.layer.cornerRadius = 16
  37. contentView.addSubview(pagerView)
  38. pagerView.snp.makeConstraints { make in
  39. make.top.equalToSuperview()
  40. make.leading.equalToSuperview().offset(16)
  41. make.trailing.equalToSuperview().offset(-16)
  42. make.bottom.equalToSuperview().offset(-10)
  43. }
  44. pagerView.addSubview(pageControl)
  45. pageControl.snp.makeConstraints { make in
  46. make.centerX.equalToSuperview()
  47. make.bottom.equalToSuperview().offset(-6)
  48. make.height.equalTo(4)
  49. }
  50. }
  51. func setupPager() {
  52. pagerView.isInfiniteLoop = true
  53. pagerView.autoScrollInterval = 3
  54. pagerView.reloadDataNeedResetIndex = true
  55. pagerView.bindPageControl(pageControl)
  56. pagerView.register(LNAdBannerImageCell.self, forCellWithReuseIdentifier: LNAdBannerImageCell.className)
  57. pagerView.layer.cornerRadius = 16
  58. pagerView.layer.masksToBounds = true
  59. pagerView.layer.borderWidth = 0.5
  60. pagerView.layer.borderColor = UIColor(hex: "#FFFFFF").cgColor
  61. pagerView.numberOfItemsProvider = { [weak self] in
  62. self?.items.count ?? 0
  63. }
  64. pagerView.cellProvider = { [weak self] pager, index in
  65. guard let self else { return UICollectionViewCell() }
  66. let cell = pager.dequeueReusableCell(
  67. withReuseIdentifier: LNAdBannerImageCell.className,
  68. for: index
  69. ) as! LNAdBannerImageCell
  70. cell.update(items[index])
  71. return cell
  72. }
  73. pagerView.layoutProvider = { [weak self] in
  74. let layout = LNCyclePagerViewLayout()
  75. let size = self?.pagerView.bounds.size ?? .zero
  76. layout.itemSize = size
  77. layout.itemSpacing = 0
  78. layout.scrollDirection = .horizontal
  79. layout.layoutType = .normal
  80. return layout
  81. }
  82. pagerView.didScrollFromIndexToIndex = { [weak self] _, toIndex in
  83. self?.pageControl.currentPage = toIndex
  84. }
  85. pagerView.didSelectItem = { [weak self] _, index in
  86. guard let self, index >= 0, index < items.count else { return }
  87. let item = items[index]
  88. onTapBanner?(item, index)
  89. guard !item.jump.isEmpty else { return }
  90. if !hasLogin {
  91. LNLoginPanel.show(container: navigationController?.viewControllers.first?.view)
  92. return
  93. }
  94. pushToWebView(LNJumpWebViewConfig.normalConfig(url: item.jump))
  95. }
  96. pageControl.pageIndicatorSize = CGSize(width: 3, height: 3)
  97. pageControl.currentPageIndicatorSize = CGSize(width: 3, height: 3)
  98. pageControl.pageIndicatorTintColor = .init(hex: "#1D21294D")
  99. pageControl.currentPageIndicatorTintColor = .white
  100. pageControl.pageIndicatorSpacing = 3
  101. }
  102. }