//
|
// HomeTopMenuView.swift
|
// XQMuse
|
//
|
// Created by 无故事王国 on 2024/8/12.
|
//
|
|
import UIKit
|
import JQTools
|
import RxSwift
|
import AVFoundation
|
|
enum ImageFromType {
|
case local
|
case url
|
}
|
|
struct HomeTopMenuItem{
|
var id = 0
|
var title = ""
|
var image = ""
|
var imageFrom:ImageFromType = .local
|
}
|
|
class HomeTopMenuView: UIView,JQNibView{
|
|
@IBOutlet weak var image_top: UIImageView!
|
@IBOutlet weak var menu_collectionView: UICollectionView!
|
@IBOutlet weak var menu_height: NSLayoutConstraint!
|
|
private var disposeBag = DisposeBag()
|
private var defaultItems = [HomeTopMenuItem]()
|
private var clouse:((HomeTopMenuItem)->Void)?
|
private let session = URLSession.shared
|
private var aVPlayerLayer:AVPlayerLayer?
|
|
override func awakeFromNib() {
|
super.awakeFromNib()
|
|
image_top.layer.masksToBounds = true
|
image_top.image = UIImage(named: "home_top_bg")
|
menu_height.constant = 119
|
menu_collectionView.delegate = self
|
menu_collectionView.dataSource = self
|
menu_collectionView.isScrollEnabled = false
|
menu_collectionView.register(UINib(nibName: "HomeTopMenuCCell", bundle: nil), forCellWithReuseIdentifier: "_HomeTopMenuCCell")
|
|
defaultItems.append(HomeTopMenuItem(title: "睡眠疗愈", image: "icon_sleep", imageFrom: .local))
|
defaultItems.append(HomeTopMenuItem(title: "高频疗愈", image: "icon_band", imageFrom: .local))
|
defaultItems.append(HomeTopMenuItem(title: "清业疗愈", image: "icon_quiet", imageFrom: .local))
|
defaultItems.append(HomeTopMenuItem(title: "亲子疗愈", image: "icon_parent-child", imageFrom: .local))
|
menu_collectionView.reloadData()
|
|
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: nil, queue: nil) { [weak self] data in
|
self?.aVPlayerLayer?.player?.seek(to: .zero)
|
self?.aVPlayerLayer?.player?.play()
|
}
|
|
if let url = Bundle.main.url(forResource: "bg_water", withExtension: "mov"){
|
setPlayer(url: url)
|
}
|
|
}
|
|
func resetTopImage(){
|
var needLocalVideo = false
|
if let imgUrl = UserDefaultSettingViewModel.getSetting()?.sceneMusicModel?.imageUrl.jq_urlEncoded(),imgUrl.isEmpty == false{
|
image_top.sd_setImage(with: URL(string: imgUrl))
|
}else{
|
image_top.image = UIImage(named: "home_top_bg")
|
needLocalVideo = true
|
}
|
|
if let model = UserDefaultSettingViewModel.getSetting()?.sceneMusicModel{
|
|
aVPlayerLayer?.player?.pause()
|
aVPlayerLayer?.removeFromSuperlayer()
|
aVPlayerLayer = nil
|
|
if model.backName?.isEmpty ?? true && model.imageUrl.isEmpty == false{
|
image_top.sd_setImage(with: URL(string: model.imageUrl.jq_urlEncoded()))
|
}
|
|
if let videoUrl = model.backUrl,videoUrl.isEmpty == false{
|
checkCacheAudio(from: URL(string: videoUrl)!) {[unowned self] state, url in
|
self.setPlayer(url: url)
|
}
|
return
|
}
|
|
if needLocalVideo{
|
if let url = Bundle.main.url(forResource: "bg_water", withExtension: "mov"){
|
setPlayer(url: url)
|
}
|
}
|
}
|
}
|
|
private func setPlayer(url:URL){
|
|
let player = AVPlayer(url: url)
|
player.play()
|
player.isMuted = true
|
|
if aVPlayerLayer == nil{
|
aVPlayerLayer = AVPlayerLayer()
|
aVPlayerLayer = AVPlayerLayer(player: player)
|
aVPlayerLayer?.frame = image_top.frame
|
aVPlayerLayer?.videoGravity = .resizeAspectFill
|
self.layer.addSublayer(aVPlayerLayer!)
|
}
|
}
|
|
// 下载视频并缓存,如果没有缓存,原路返回并异步下载
|
internal func checkCacheAudio(from url: URL, completion: @escaping (Bool,URL) -> Void) {
|
|
let cacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("bgVideos")
|
|
let videoCacheUrl = cacheDirectory.appendingPathComponent(url.lastPathComponent.jq_md5String() + "." + url.pathExtension)
|
|
// 检查缓存中是否已存在文件
|
if FileManager.default.fileExists(atPath: videoCacheUrl.path) {
|
print("启用缓存")
|
completion(true,videoCacheUrl)
|
return
|
}else{
|
completion(false,url)
|
print("没有缓存:执行下载")
|
}
|
|
// 使用URLSession下载视频
|
let downloadTask = session.downloadTask(with: url) {
|
tempLocalUrl, response, error in
|
print("执行下载任务")
|
if let tempLocalUrl = tempLocalUrl, error == nil {
|
do {
|
let temp = videoCacheUrl
|
|
if !(FileManager.default.fileExists(atPath: cacheDirectory.path)){
|
try FileManager.default.createDirectory(at: cacheDirectory, withIntermediateDirectories: true)
|
}
|
|
try FileManager.default.moveItem(at: tempLocalUrl, to: temp)
|
} catch let e {
|
print("视频缓存失败:catch:\(e)")
|
|
|
|
}
|
} else {
|
print("视频缓存失败:\(error?.localizedDescription ?? "")")
|
}
|
}
|
downloadTask.resume()
|
}
|
|
func resetItems(_ items:[HomeTopMenuItem]){
|
defaultItems.removeAll()
|
defaultItems = items
|
menu_collectionView.reloadData()
|
}
|
|
func insertOthers(_ others:[HomeTopMenuItem]){
|
defaultItems.append(contentsOf: others)
|
menu_collectionView.reloadData()
|
}
|
|
|
func clickItemAt(_ clouse: @escaping (HomeTopMenuItem)->Void){
|
self.clouse = clouse
|
}
|
}
|
|
|
extension HomeTopMenuView:UICollectionViewDelegate & UICollectionViewDataSource{
|
|
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
let item = defaultItems[indexPath.row]
|
clouse?(item)
|
}
|
|
|
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
return defaultItems.count
|
}
|
|
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_HomeTopMenuCCell", for: indexPath) as! HomeTopMenuCCell
|
cell.setItem(defaultItems[indexPath.row])
|
cell.view_line.isHidden = indexPath.row == 3
|
return cell
|
}
|
}
|
|
extension HomeTopMenuView:UICollectionViewDelegateFlowLayout{
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
|
return 0
|
}
|
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
|
return 0
|
}
|
|
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
|
let w = JQ_ScreenW / 4.0
|
return CGSize(width: w, height: 119)
|
}
|
}
|