188 lines
6.4 KiB
Swift
188 lines
6.4 KiB
Swift
//
|
|
// BRFavoritesHeaderView.swift
|
|
// BeeReel
|
|
//
|
|
// Created by 长沙鸿瑶 on 2025/7/22.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class BRFavoritesHeaderView: UICollectionReusableView {
|
|
|
|
var model: BRShortModel? {
|
|
didSet {
|
|
coverView.br_setImage(url: model?.image_url)
|
|
nameLabel.text = model?.name
|
|
categoryLabel.text = model?.category?.first
|
|
|
|
let epString = NSMutableAttributedString()
|
|
|
|
let epStr1 = NSMutableAttributedString(string: "EP.##".localizedReplace(text: model?.current_episode ?? ""))
|
|
epStr1.yy_color = .colorE3FC37()
|
|
epString.append(epStr1)
|
|
|
|
let epStr2 = NSMutableAttributedString(string: "/" + "EP.##".localizedReplace(text: "\(model?.episode_total ?? 0)"))
|
|
epStr2.yy_color = .colorFFFFFF()
|
|
epString.append(epStr2)
|
|
|
|
epLabel.attributedText = epString
|
|
|
|
favoriteButton.isSelected = self.model?.is_collect ?? false
|
|
}
|
|
}
|
|
|
|
private lazy var bgView: UIImageView = {
|
|
let view = UIImageView(image: UIImage(named: "history_bg_image"))
|
|
view.isUserInteractionEnabled = true
|
|
let tap = UITapGestureRecognizer(target: self, action: #selector(handlePlayButton))
|
|
view.addGestureRecognizer(tap)
|
|
return view
|
|
}()
|
|
|
|
private lazy var coverView: BRImageView = {
|
|
let imageView = BRImageView()
|
|
imageView.layer.cornerRadius = 8
|
|
imageView.layer.masksToBounds = true
|
|
imageView.isUserInteractionEnabled = true
|
|
return imageView
|
|
}()
|
|
|
|
private lazy var playButton: UIButton = {
|
|
let button = UIButton(type: .custom)
|
|
button.isUserInteractionEnabled = false
|
|
button.layer.cornerRadius = 10
|
|
button.layer.masksToBounds = true
|
|
button.backgroundColor = .colorE3FC37()
|
|
button.setImage(UIImage(named: "play_icon_06"), for: .normal)
|
|
return button
|
|
}()
|
|
|
|
private lazy var nameLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .fontMedium(ofSize: 14)
|
|
label.textColor = .colorFFFFFF()
|
|
label.numberOfLines = 2
|
|
return label
|
|
}()
|
|
|
|
private lazy var categoryLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .fontRegular(ofSize: 12)
|
|
label.textColor = .colorF1FF94()
|
|
return label
|
|
}()
|
|
|
|
private lazy var epLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .fontRegular(ofSize: 12)
|
|
return label
|
|
}()
|
|
|
|
private lazy var favoriteButton: UIButton = {
|
|
let button = UIButton(type: .custom)
|
|
button.setImage(UIImage(named: "favorite_icon_04"), for: .normal)
|
|
button.setImage(UIImage(named: "favorite_icon_04_selected"), for: .selected)
|
|
button.setImage(UIImage(named: "favorite_icon_04_selected"), for: [.selected, .highlighted])
|
|
button.addTarget(self, action: #selector(handleFavoriteButton), for: .touchUpInside)
|
|
return button
|
|
}()
|
|
|
|
deinit {
|
|
NotificationCenter.default.removeObserver(self)
|
|
}
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
NotificationCenter.default.addObserver(self, selector: #selector(updateShortFavoriteStateNotification), name: BRVideoAPI.updateShortFavoriteStateNotification, object: nil)
|
|
|
|
br_setupUI()
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
@objc private func handlePlayButton() {
|
|
guard let shortPlayId = self.model?.short_play_id else { return }
|
|
|
|
let vc = BRVideoDetailViewController()
|
|
vc.shortPlayId = shortPlayId
|
|
self.viewController?.navigationController?.pushViewController(vc, animated: true)
|
|
}
|
|
|
|
@objc private func handleFavoriteButton() {
|
|
guard let shortPlayId = self.model?.short_play_id else { return }
|
|
let isFavorite = !(self.model?.is_collect ?? false)
|
|
|
|
BRVideoAPI.favoriteOrCancelFavorite(isFavorite: isFavorite, shortPlayId: shortPlayId, videoId: model?.short_play_video_id)
|
|
}
|
|
|
|
@objc private func updateShortFavoriteStateNotification(sender: Notification) {
|
|
guard let userInfo = sender.userInfo else { return }
|
|
guard let shortPlayId = userInfo["id"] as? String else { return }
|
|
guard let state = userInfo["state"] as? Bool else { return }
|
|
guard shortPlayId == self.model?.short_play_id else { return }
|
|
|
|
self.model?.is_collect = state
|
|
|
|
favoriteButton.isSelected = self.model?.is_collect ?? false
|
|
}
|
|
|
|
}
|
|
|
|
extension BRFavoritesHeaderView {
|
|
|
|
private func br_setupUI() {
|
|
addSubview(bgView)
|
|
bgView.addSubview(coverView)
|
|
coverView.addSubview(favoriteButton)
|
|
bgView.addSubview(playButton)
|
|
bgView.addSubview(nameLabel)
|
|
bgView.addSubview(categoryLabel)
|
|
bgView.addSubview(epLabel)
|
|
|
|
bgView.snp.makeConstraints { make in
|
|
make.left.equalToSuperview().offset(15)
|
|
make.right.equalToSuperview().offset(-15)
|
|
make.top.equalToSuperview()
|
|
make.bottom.equalToSuperview().offset(-16)
|
|
}
|
|
|
|
coverView.snp.makeConstraints { make in
|
|
make.left.equalToSuperview().offset(10)
|
|
make.centerY.equalToSuperview()
|
|
make.width.equalTo(109)
|
|
make.height.equalTo(144)
|
|
}
|
|
|
|
favoriteButton.snp.makeConstraints { make in
|
|
make.top.equalToSuperview().offset(5)
|
|
make.right.equalToSuperview().offset(-5)
|
|
}
|
|
|
|
playButton.snp.makeConstraints { make in
|
|
make.right.equalToSuperview().offset(-10)
|
|
make.bottom.equalToSuperview().offset(-10)
|
|
make.height.equalTo(116)
|
|
make.width.equalTo(40)
|
|
}
|
|
|
|
nameLabel.snp.makeConstraints { make in
|
|
make.left.equalTo(coverView.snp.right).offset(8)
|
|
make.top.equalToSuperview().offset(20)
|
|
make.right.lessThanOrEqualToSuperview().offset(-78)
|
|
}
|
|
|
|
categoryLabel.snp.makeConstraints { make in
|
|
make.left.equalTo(nameLabel)
|
|
make.top.equalToSuperview().offset(75)
|
|
}
|
|
|
|
epLabel.snp.makeConstraints { make in
|
|
make.left.equalTo(nameLabel)
|
|
make.bottom.equalToSuperview().offset(-20)
|
|
}
|
|
}
|
|
|
|
}
|