| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- //
- // LNMateAdBannerCell.swift
- // Lanu
- //
- // Created by Codex on 2026/4/8.
- //
- import Foundation
- import UIKit
- import SnapKit
- final class LNMateAdBannerCell: UITableViewCell {
- var onTapBanner: ((_ item: LNBannerInfoVO, _ index: Int) -> Void)?
- private let pagerView = LNCyclePager()
- private let pageControl = LNCyclePageControl()
- private var items: [LNBannerInfoVO] = []
- override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
- super.init(style: style, reuseIdentifier: reuseIdentifier)
- setupViews()
- setupPager()
- }
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- func update(items: [LNBannerInfoVO]) {
- self.items = items
- pageControl.numberOfPages = items.count
- pageControl.currentPage = 0
- pageControl.isHidden = items.count <= 1
- pagerView.reloadData()
- }
- }
- private extension LNMateAdBannerCell {
- func setupViews() {
- backgroundColor = .clear
- selectionStyle = .none
- contentView.layer.masksToBounds = true
- contentView.layer.cornerRadius = 16
- contentView.addSubview(pagerView)
- pagerView.snp.makeConstraints { make in
- make.top.equalToSuperview()
- make.leading.equalToSuperview().offset(16)
- make.trailing.equalToSuperview().offset(-16)
- make.bottom.equalToSuperview().offset(-10)
- }
- pagerView.addSubview(pageControl)
- pageControl.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.bottom.equalToSuperview().offset(-6)
- make.height.equalTo(4)
- }
- }
- func setupPager() {
- pagerView.isInfiniteLoop = true
- pagerView.autoScrollInterval = 3
- pagerView.reloadDataNeedResetIndex = true
- pagerView.bindPageControl(pageControl)
- pagerView.register(LNAdBannerImageCell.self, forCellWithReuseIdentifier: LNAdBannerImageCell.className)
- pagerView.layer.cornerRadius = 16
- pagerView.layer.masksToBounds = true
- pagerView.layer.borderWidth = 0.5
- pagerView.layer.borderColor = UIColor(hex: "#FFFFFF").cgColor
- pagerView.numberOfItemsProvider = { [weak self] in
- self?.items.count ?? 0
- }
- pagerView.cellProvider = { [weak self] pager, index in
- guard let self else { return UICollectionViewCell() }
- let cell = pager.dequeueReusableCell(
- withReuseIdentifier: LNAdBannerImageCell.className,
- for: index
- ) as! LNAdBannerImageCell
- cell.update(items[index])
- return cell
- }
- pagerView.layoutProvider = { [weak self] in
- let layout = LNCyclePagerViewLayout()
- let size = self?.pagerView.bounds.size ?? .zero
- layout.itemSize = size
- layout.itemSpacing = 0
- layout.scrollDirection = .horizontal
- layout.layoutType = .normal
- return layout
- }
- pagerView.didScrollFromIndexToIndex = { [weak self] _, toIndex in
- self?.pageControl.currentPage = toIndex
- }
- pagerView.didSelectItem = { [weak self] _, index in
- guard let self, index >= 0, index < items.count else { return }
- let item = items[index]
- onTapBanner?(item, index)
- guard !item.jump.isEmpty else { return }
- if !hasLogin {
- LNLoginPanel.show(container: navigationController?.viewControllers.first?.view)
- return
- }
- pushToWebView(LNJumpWebViewConfig.normalConfig(url: item.jump))
- }
- pageControl.pageIndicatorSize = CGSize(width: 3, height: 3)
- pageControl.currentPageIndicatorSize = CGSize(width: 3, height: 3)
- pageControl.pageIndicatorTintColor = .init(hex: "#1D21294D")
- pageControl.currentPageIndicatorTintColor = .white
- pageControl.pageIndicatorSpacing = 3
- }
- }
|