307 lines
14 KiB
Swift
307 lines
14 KiB
Swift
//
|
||
// MPPositive_SearchViewController.swift
|
||
// MusicPlayer
|
||
//
|
||
// Created by Mr.Zhou on 2024/4/19.
|
||
//
|
||
|
||
import UIKit
|
||
|
||
class MPPositive_SearchViewController: MPPositive_BaseViewController {
|
||
//背景图片
|
||
private lazy var bgImageView:UIImageView = {
|
||
let imageView:UIImageView = .init(image: .init(named: "B_Home_BG'bg"))
|
||
imageView.contentMode = .scaleAspectFill
|
||
return imageView
|
||
}()
|
||
//搜索历史展示
|
||
private lazy var historyCollectionView:UICollectionView = {
|
||
let layout = MPPositive_TagFlowLayout()
|
||
layout.delegate = self
|
||
let collectionView:UICollectionView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height), collectionViewLayout: layout)
|
||
collectionView.showsVerticalScrollIndicator = false
|
||
collectionView.showsHorizontalScrollIndicator = false
|
||
collectionView.backgroundColor = .clear
|
||
collectionView.dataSource = self
|
||
collectionView.delegate = self
|
||
collectionView.register(MPPositive_SearchTagCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_SearchTagCollectionViewCellID)
|
||
return collectionView
|
||
}()
|
||
private let MPPositive_SearchTagCollectionViewCellID = "MPPositive_SearchTagCollectionViewCell"
|
||
//模块展示
|
||
private lazy var grideCollectionView:UICollectionView = {
|
||
let layout = UICollectionViewFlowLayout()
|
||
layout.itemSize = .init(width: 162*width, height: 60*width)
|
||
layout.sectionInset = .init(top: 20*width, left: 18*width, bottom: 70*width, right: 18*width)
|
||
let collectionView = UICollectionView(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height), collectionViewLayout: layout)
|
||
collectionView.showsVerticalScrollIndicator = false
|
||
collectionView.showsHorizontalScrollIndicator = false
|
||
collectionView.backgroundColor = .clear
|
||
collectionView.dataSource = self
|
||
collectionView.delegate = self
|
||
collectionView.register(MPPositive_SearchGrideCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_SearchGrideCollectionViewCellID)
|
||
return collectionView
|
||
}()
|
||
fileprivate let MPPositive_SearchGrideCollectionViewCellID = "MPPositive_SearchGrideCollectionViewCell"
|
||
//历史标签
|
||
private lazy var historyLabel:UILabel = createLabel("History", font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .init(hex: "#666666"), textAlignment: .left)
|
||
//删除按钮
|
||
private lazy var deleteBtn:UIButton = {
|
||
let btn:UIButton = .init()
|
||
btn.setBackgroundImage(UIImage(named: "Tag_Delete'logo"), for: .normal)
|
||
btn.addTarget(self, action: #selector(deleteClick(_ :)), for: .touchUpInside)
|
||
return btn
|
||
}()
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
setTitle("")
|
||
configure()
|
||
//加载搜索原生广告
|
||
MP_AdMobManager.shared.configureSreachNativeAd(rootController: self)
|
||
MP_AdMobManager.shared.loadSearchNativeAd()
|
||
NotificationCenter.notificationKey.add(observer: self, selector: #selector(grideReloadAction(_ :)), notificationName: .search_gride_reload)
|
||
}
|
||
override func viewWillAppear(_ animated: Bool) {
|
||
super.viewWillAppear(animated)
|
||
MP_AnalyticsManager.shared.search_pvAction()
|
||
MPPositive_LoadCoreModel.shared.reloadSearchTags {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
historyCollectionView.reloadData()
|
||
guard let layout = historyCollectionView.collectionViewLayout as? MPPositive_TagFlowLayout, let height = layout.layoutAttributeds.last?.frame.maxY else {return}
|
||
historyCollectionView.snp.updateConstraints { make in
|
||
make.height.equalTo(height)
|
||
}
|
||
}
|
||
grideCollectionView.reloadData()
|
||
}
|
||
override func viewWillDisappear(_ animated: Bool) {
|
||
super.viewWillDisappear(animated)
|
||
|
||
}
|
||
deinit{
|
||
NotificationCenter.default.removeObserver(self)
|
||
}
|
||
//配置
|
||
private func configure() {
|
||
let searchView = createSearchView()
|
||
navView.addSubview(searchView)
|
||
searchView.snp.makeConstraints { make in
|
||
make.width.equalTo(339*width)
|
||
make.height.equalTo(32*width)
|
||
make.center.equalToSuperview()
|
||
}
|
||
view.addSubview(bgImageView)
|
||
bgImageView.snp.makeConstraints { make in
|
||
make.top.right.left.equalToSuperview()
|
||
make.height.equalTo(981*width)
|
||
}
|
||
view.addSubview(deleteBtn)
|
||
deleteBtn.snp.makeConstraints { make in
|
||
make.width.height.equalTo(24*width)
|
||
make.right.equalToSuperview().offset(-18*width)
|
||
make.top.equalTo(navView.snp.bottom).offset(24*width)
|
||
}
|
||
view.addSubview(historyLabel)
|
||
historyLabel.snp.makeConstraints { make in
|
||
make.centerY.equalTo(deleteBtn)
|
||
make.left.equalToSuperview().offset(18*width)
|
||
}
|
||
view.addSubview(historyCollectionView)
|
||
historyCollectionView.snp.makeConstraints { make in
|
||
make.left.right.equalToSuperview()
|
||
make.top.equalTo(deleteBtn.snp.bottom).offset(6*width)
|
||
make.height.equalTo(30*width)
|
||
}
|
||
view.addSubview(grideCollectionView)
|
||
grideCollectionView.snp.makeConstraints { make in
|
||
make.top.equalTo(historyCollectionView.snp.bottom)
|
||
make.left.right.bottom.equalToSuperview()
|
||
}
|
||
}
|
||
//生成一个顶部搜索框
|
||
private func createSearchView() -> UIView{
|
||
let searchView:UIView = UIView()
|
||
searchView.backgroundColor = .init(hex: "#212121")
|
||
searchView.isUserInteractionEnabled = true
|
||
searchView.layer.masksToBounds = true
|
||
searchView.layer.cornerRadius = 16*width
|
||
//添加一个icon
|
||
let iconImageView = UIImageView(image: .init(named: "Search_ICON'logo"))
|
||
searchView.addSubview(iconImageView)
|
||
iconImageView.snp.makeConstraints { make in
|
||
make.height.width.equalTo(16*width)
|
||
make.left.equalToSuperview().offset(16*width)
|
||
make.centerY.equalToSuperview()
|
||
}
|
||
let label = createLabel("Search songs,artists,playlists", font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .init(hex: "#666666"), textAlignment: .left)
|
||
searchView.addSubview(label)
|
||
label.snp.makeConstraints { make in
|
||
make.left.equalTo(iconImageView.snp.right).offset(8*width)
|
||
make.centerY.equalToSuperview()
|
||
}
|
||
searchView.isUserInteractionEnabled = true
|
||
searchView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(searchClick(_:))))
|
||
return searchView
|
||
}
|
||
//刷新
|
||
@objc private func grideReloadAction(_ sender:Notification) {
|
||
DispatchQueue.main.async {
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
grideCollectionView.reloadData()
|
||
}
|
||
}
|
||
//前往搜索结果页
|
||
@objc fileprivate func searchClick(_ sender:UITapGestureRecognizer) {
|
||
let resultVC = MPPositive_SearchResultShowViewController()
|
||
navigationController?.pushViewController(resultVC, animated: false)
|
||
}
|
||
//删除按钮
|
||
@objc private func deleteClick(_ sender:UIButton) {
|
||
//移除所有
|
||
MPPositive_SearchTagModel.fetchAll { [weak self] items in
|
||
guard let self = self else {return}
|
||
items.forEach({(MPPositive_SearchTagModel.delete($0))})
|
||
guard let layout = historyCollectionView.collectionViewLayout as? MPPositive_TagFlowLayout else {return}
|
||
layout.originxArray.removeAll()
|
||
layout.originyArray.removeAll()
|
||
layout.layoutAttributeds.removeAll()
|
||
historyCollectionView.reloadData()
|
||
historyCollectionView.snp.updateConstraints { make in
|
||
make.height.equalTo(10)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//MARK: - collectionView
|
||
extension MPPositive_SearchViewController: UICollectionViewDataSource, UICollectionViewDelegate, MPPositive_TagLayoutDelegate {
|
||
|
||
func waterFlowLayout(_ layout: MPPositive_TagFlowLayout, indexPath: IndexPath) -> CGFloat {
|
||
let text = MPPositive_LoadCoreModel.shared.searchTags[indexPath.row].text ?? ""
|
||
let textWidth = text.textAutoWidth(height: 11.5 * width, font: .systemFont(ofSize: 12 * width, weight: .medium)) + (43 * width)
|
||
return textWidth
|
||
}
|
||
|
||
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||
if collectionView == historyCollectionView {
|
||
return MPPositive_LoadCoreModel.shared.searchTags.count > 10 ? 10:MPPositive_LoadCoreModel.shared.searchTags.count
|
||
}else {
|
||
return MPPositive_GridLoadViewModel.shared.grideViewModels.count
|
||
}
|
||
}
|
||
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||
if collectionView == historyCollectionView {
|
||
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_SearchTagCollectionViewCellID, for: indexPath) as! MPPositive_SearchTagCollectionViewCell
|
||
cell.setText(MPPositive_LoadCoreModel.shared.searchTags[indexPath.row].text)
|
||
return cell
|
||
}else {
|
||
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_SearchGrideCollectionViewCellID, for: indexPath) as! MPPositive_SearchGrideCollectionViewCell
|
||
cell.gride = MPPositive_GridLoadViewModel.shared.grideViewModels[indexPath.row]
|
||
return cell
|
||
}
|
||
}
|
||
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
||
if collectionView == historyCollectionView {
|
||
let text = MPPositive_LoadCoreModel.shared.searchTags[indexPath.row].text ?? ""
|
||
let resultVC = MPPositive_SearchResultShowViewController(text)
|
||
navigationController?.pushViewController(resultVC, animated: false)
|
||
}else {
|
||
if indexPath.row <= (MPPositive_GridLoadViewModel.shared.grideViewModels.count - 1) {
|
||
let item = MPPositive_GridLoadViewModel.shared.grideViewModels[indexPath.row]
|
||
MP_AnalyticsManager.shared.grid_mood_clickAction(item.title ?? "")
|
||
let moodVC = MPPositive_GrideMoodViewController(item.grid.browseId, params: item.grid.params, title: item.title ?? "")
|
||
navigationController?.pushViewController(moodVC, animated: false)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//MARK: - 宽度代理
|
||
protocol MPPositive_TagLayoutDelegate {
|
||
func waterFlowLayout(_ layout:MPPositive_TagFlowLayout,indexPath:IndexPath) -> CGFloat
|
||
}
|
||
//MARK: - 重写布局
|
||
///标签layout
|
||
class MPPositive_TagFlowLayout: UICollectionViewFlowLayout {
|
||
//固定行高
|
||
var rowHeight:CGFloat = 22 * width
|
||
//宽度获取代理
|
||
var delegate:MPPositive_TagLayoutDelegate?
|
||
//x值数组
|
||
var originxArray:[CGFloat]!
|
||
//y值数组
|
||
var originyArray:[CGFloat]!
|
||
//记录的布局值
|
||
var layoutAttributeds:[UICollectionViewLayoutAttributes] = []
|
||
override init() {
|
||
super.init()
|
||
//列间距
|
||
minimumInteritemSpacing = 8 * width
|
||
//行间距
|
||
minimumLineSpacing = 8 * width
|
||
//内边距
|
||
sectionInset = .init(top: 5 * width, left: 18 * width, bottom: 5 * width, right: 18 * width)
|
||
scrollDirection = .vertical
|
||
//初始化数组
|
||
originxArray = [CGFloat]()
|
||
originyArray = [CGFloat]()
|
||
}
|
||
|
||
required init?(coder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
//MARK: - 重写父类方法,实现瀑布流布局
|
||
//当尺寸发生变化时,刷新布局
|
||
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
|
||
return true
|
||
}
|
||
override func prepare() {
|
||
super.prepare()
|
||
}
|
||
//处理所有item的layoutAttributes
|
||
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
|
||
let array = super.layoutAttributesForElements(in: rect)
|
||
var mutArray = [UICollectionViewLayoutAttributes]()
|
||
array?.forEach({ (attrs) in
|
||
let theAttrs = layoutAttributesForItem(at: attrs.indexPath)
|
||
mutArray.append(theAttrs!)
|
||
})
|
||
layoutAttributeds = mutArray
|
||
return mutArray
|
||
}
|
||
//处理单个item的layoutAttributes
|
||
override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
|
||
//起始x值
|
||
var x = sectionInset.left
|
||
var y = sectionInset.top
|
||
//判断获得前一个cell的x和y
|
||
let preRow = indexPath.row - 1
|
||
if preRow >= 0 {
|
||
//不是第一个cell
|
||
if originyArray.count > preRow {
|
||
//更新x和y值
|
||
x = originxArray[preRow]
|
||
y = originyArray[preRow]
|
||
}
|
||
let preIndexPath = IndexPath(item: preRow, section: indexPath.section)
|
||
//计算宽度
|
||
let preWidth = delegate?.waterFlowLayout(self, indexPath: preIndexPath)
|
||
x += preWidth! + minimumInteritemSpacing
|
||
}
|
||
var currentWidth = delegate?.waterFlowLayout(self, indexPath: indexPath)
|
||
//保证每一个cell不超过最大宽度
|
||
currentWidth = min(currentWidth!, collectionView!.frame.size.width - sectionInset.left - sectionInset.right)
|
||
if x + currentWidth! > collectionView!.frame.size.width - sectionInset.right {
|
||
//超出范围,换行
|
||
x = self.sectionInset.left
|
||
y += rowHeight + minimumLineSpacing
|
||
}
|
||
//创建属性
|
||
let attrs = UICollectionViewLayoutAttributes.init(forCellWith: indexPath)
|
||
attrs.frame = CGRect(x: x, y: y, width: currentWidth!, height: rowHeight)
|
||
originxArray.insert(x, at: indexPath.row)
|
||
originyArray.insert(y, at: indexPath.row)
|
||
return attrs
|
||
}
|
||
}
|