SynthReel/SynthReel/Class/Player/VM/V/SRDetailRecommendview.swift
2025-12-08 17:06:30 +08:00

176 lines
5.0 KiB
Swift

//
// SRDetailRecommendview.swift
// SynthReel
//
// Created by CSGY on 2025/11/27.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
import FSPagerView
class SRDetailRecommendview: SRBaseAlert {
var clickCloseButton: (() -> Void)?
var didSelectedVideo: ((_ model: SRShortModel) -> Void)?
var dataArr: [SRShortModel] = [] {
didSet {
self.pagerView.reloadData()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
self?.updateCurrentData()
}
}
}
private weak var currentCell: SRDetailRecommendCell? {
didSet {
oldValue?.pause()
currentCell?.play()
}
}
private lazy var titleLabel: SRLabel = {
let label = SRLabel()
label.font = .font(ofSize: 16, weight: .init(900))
label.textColors = [UIColor._4_CFFD_4.cgColor, UIColor._51_D_4_FF.cgColor]
label.textStartPoint = .init(x: 0.5, y: 0)
label.textEndPoint = .init(x: 0.5, y: 1)
label.text = "Keep the Drama Going".localized
return label
}()
private lazy var bgView: UIImageView = {
let view = UIImageView(image: UIImage(named: "recommendBg"))
view.isUserInteractionEnabled = true
return view
}()
private lazy var cancelButton: UIButton = {
let button = UIButton(type: .custom)
button.setImage(UIImage(named: "Close"), for: .normal)
button.addTarget(self, action: #selector(handleCancelButton), for: .touchUpInside)
return button
}()
private lazy var pagerView: FSPagerView = {
let transformer = SRPagerViewTransformer(type: .linear)
transformer.minimumScale = 1
let view = FSPagerView()
view.itemSize = .init(width: 132, height: 185)
view.transformer = transformer
view.delegate = self
view.dataSource = self
view.isInfinite = true
view.interitemSpacing = 8
view.register(SRDetailRecommendCell.self, forCellWithReuseIdentifier: "cell")
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
contentWidth = UIScreen.width
self.closeButton.isHidden = true
self.contentView.backgroundColor = .clear
self.contentView.layer.cornerRadius = 0
self.contentView.layer.masksToBounds = false
fa_setupLayout()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc private func handleCancelButton() {
self.dismiss()
self.clickCloseButton?()
}
///
private func updateCurrentData() {
guard let cell = self.pagerView.cellForItem(at: self.pagerView.currentIndex) as? SRDetailRecommendCell else { return }
self.currentCell = cell
// let model = cell.model
// self.videoNameLabel.text = model?.name
}
}
extension SRDetailRecommendview {
private func fa_setupLayout() {
contentView.addSubview(bgView)
contentView.addSubview(cancelButton)
bgView.addSubview(titleLabel)
bgView.addSubview(pagerView)
bgView.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(15)
make.top.equalToSuperview().offset(-25)
// make.bottom.e()
}
titleLabel.snp.makeConstraints { make in
make.top.equalTo(17)
make.centerX.equalToSuperview()
}
pagerView.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(10)
make.bottom.equalTo(-17)
make.top.equalTo(titleLabel.snp.bottom).offset(10)
}
cancelButton.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalTo(bgView.snp.bottom).offset(30)
make.bottom.equalToSuperview()
}
}
}
//MARK: FSPagerViewDelegate FSPagerViewDataSource
extension SRDetailRecommendview: FSPagerViewDelegate, FSPagerViewDataSource {
func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell {
let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) as! SRDetailRecommendCell
cell.model = self.dataArr[index]
return cell
}
func numberOfItems(in pagerView: FSPagerView) -> Int {
return self.dataArr.count
}
func pagerView(_ pagerView: FSPagerView, didSelectItemAt index: Int) {
didSelectedVideo?(self.dataArr[index])
self.dismiss()
}
func pagerViewDidEndDecelerating(_ pagerView: FSPagerView) {
self.updateCurrentData()
}
}
extension SRDetailRecommendview {
class PageControl: UIPageControl{
override func size(forNumberOfPages pageCount: Int) -> CGSize {
return .init(width: 4, height: 4)
}
}
}