From 84689e7ade2816fbf644588ba0b100b1f0b87d90 Mon Sep 17 00:00:00 2001 From: zeng Date: Thu, 19 Jun 2025 09:50:44 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=80=A7=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MoviaBox/Base/Extension/UIImage+SPAdd.swift | 29 +++++++++++ MoviaBox/Base/View/SPFadeEdgeImageView.swift | 52 +++++++++++-------- .../Controller/SPHomeViewController.swift | 13 +++-- .../Class/Home/View/SPHomeHeaderView.swift | 27 ++++++++-- .../Home/ViewModel/SPHomeViewModel.swift | 2 +- .../Class/Player/Model/SPShortModel.swift | 3 ++ 6 files changed, 95 insertions(+), 31 deletions(-) create mode 100644 MoviaBox/Base/Extension/UIImage+SPAdd.swift diff --git a/MoviaBox/Base/Extension/UIImage+SPAdd.swift b/MoviaBox/Base/Extension/UIImage+SPAdd.swift new file mode 100644 index 0000000..ea2aa5d --- /dev/null +++ b/MoviaBox/Base/Extension/UIImage+SPAdd.swift @@ -0,0 +1,29 @@ +// +// UIImage+SPAdd.swift +// MoviaBox +// +// Created by 长沙佳儿 on 2025/6/18. +// + +import UIKit + +extension UIImage { + + ///添加模糊效果 + func applyBlur() -> UIImage? { + let context = CIContext(options: nil) + + guard let ciImage = CIImage(image: self) else { return nil } + + let filter = CIFilter(name: "CIGaussianBlur") + filter?.setValue(ciImage, forKey: kCIInputImageKey) + filter?.setValue(50, forKey: kCIInputRadiusKey) // 调整模糊半径 + guard let outputImage = filter?.outputImage else { return nil } + + if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) { + return UIImage(cgImage: cgImage) + } + return nil + } + +} diff --git a/MoviaBox/Base/View/SPFadeEdgeImageView.swift b/MoviaBox/Base/View/SPFadeEdgeImageView.swift index 7cbca92..8322a97 100644 --- a/MoviaBox/Base/View/SPFadeEdgeImageView.swift +++ b/MoviaBox/Base/View/SPFadeEdgeImageView.swift @@ -9,11 +9,35 @@ import UIKit class SPFadeEdgeImageView: UIImageView { - override var image: UIImage? { - didSet { - applyBlurAndEdgeFadeEffect() - } - } +// override var image: UIImage? { +// didSet { +// +// if blurredImage != nil, blurredImage == image { +// return +// } +// +//// if let newImage = image?.applyBlur() { +//// self.blurredImage = newImage +//// self.image = newImage +//// } +// +// let context = CIContext(options: nil) +// guard let image = self.image else { return } +// guard let ciImage = CIImage(image: image) else { return } +// +// let filter = CIFilter(name: "CIGaussianBlur") +// filter?.setValue(ciImage, forKey: kCIInputImageKey) +// filter?.setValue(50, forKey: kCIInputRadiusKey) // 调整模糊半径 +// guard let outputImage = filter?.outputImage else { return } +// +// if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) { +// let blurredImage = UIImage(cgImage: cgImage) +// self.blurredImage = blurredImage +// self.image = blurredImage +// } +// +// } +// } private var blurredImage: UIImage? @@ -23,24 +47,6 @@ class SPFadeEdgeImageView: UIImageView { } private func applyBlurAndEdgeFadeEffect() { - if blurredImage != nil, blurredImage == image { - return - } - // 1. 添加高斯模糊效果到图片 - let context = CIContext(options: nil) - guard let image = self.image else { return } - guard let ciImage = CIImage(image: image) else { return } - - let filter = CIFilter(name: "CIGaussianBlur") - filter?.setValue(ciImage, forKey: kCIInputImageKey) - filter?.setValue(50, forKey: kCIInputRadiusKey) // 调整模糊半径 - guard let outputImage = filter?.outputImage else { return } - - if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) { - let blurredImage = UIImage(cgImage: cgImage) - self.blurredImage = blurredImage - self.image = blurredImage - } // 2. 创建渐变蒙版(四周虚化) let maskLayer = CAShapeLayer() diff --git a/MoviaBox/Class/Home/Controller/SPHomeViewController.swift b/MoviaBox/Class/Home/Controller/SPHomeViewController.swift index 725ef93..68c8d3f 100644 --- a/MoviaBox/Class/Home/Controller/SPHomeViewController.swift +++ b/MoviaBox/Class/Home/Controller/SPHomeViewController.swift @@ -200,22 +200,27 @@ extension SPHomeViewController { private func setEmptyView() { if SPNetworkReachabilityManager.manager.isReachable != true { self.addNoNetworkEmptyView { [weak self] in - self?.updateEmptyState() + guard let self = self else { return } + self.updateEmptyState() + if self.viewModel.isEmptyData, SPNetworkReachabilityManager.manager.isReachable == true { + self.updateAllData(completer: nil) + } } } } @objc private func reachabilityDidChangeNotification() { updateEmptyState() + + if viewModel.isEmptyData, SPNetworkReachabilityManager.manager.isReachable == true { + self.updateAllData(completer: nil) + } } ///更新空白页面状态 private func updateEmptyState() { if SPNetworkReachabilityManager.manager.isReachable == true { self._setupUI() - if viewModel.isEmptyData { - self.updateAllData(completer: nil) - } self.removeNoNetworkEmptyView() } } diff --git a/MoviaBox/Class/Home/View/SPHomeHeaderView.swift b/MoviaBox/Class/Home/View/SPHomeHeaderView.swift index 48affa1..e8d750b 100644 --- a/MoviaBox/Class/Home/View/SPHomeHeaderView.swift +++ b/MoviaBox/Class/Home/View/SPHomeHeaderView.swift @@ -14,7 +14,8 @@ class SPHomeHeaderView: UICollectionReusableView { let moduleModel = viewModel?.moduleModel let bannerModel = self.viewModel?.moduleModel?.bannerData?.first - self.bannerBgImageView.sp_setImage(url: bannerModel?.image_url) + setBannerBgImage(model: bannerModel) + stackView.removeAllArrangedSubview() @@ -64,6 +65,8 @@ class SPHomeHeaderView: UICollectionReusableView { } } + private var currentBannerModel: SPShortModel? + var isDidAppear: Bool = false { didSet { self.categoryVideoView1.isDidAppear = isDidAppear @@ -159,6 +162,25 @@ class SPHomeHeaderView: UICollectionReusableView { fatalError("init(coder:) has not been implemented") } + private func setBannerBgImage(model: SPShortModel?) { + self.currentBannerModel = model + + if let image = model?.blurImage { + self.bannerBgImageView.image = image + return + } + + self.bannerBgImageView.sp_setImage(url: model?.image_url) { [weak self] image, url in + guard let self = self else { return } + if model == self.currentBannerModel { + if model?.blurImage == nil { + model?.blurImage = image?.applyBlur() + } + self.bannerBgImageView.image = model?.blurImage + } + } + } + } extension SPHomeHeaderView { @@ -223,8 +245,7 @@ extension SPHomeHeaderView: ZKCycleScrollViewDelegate, ZKCycleScrollViewDataSour func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, didScrollFromIndex fromIndex: Int, toIndex: Int) { let model = self.viewModel?.moduleModel?.bannerData?[toIndex] - - self.bannerBgImageView.sp_setImage(url: model?.image_url) + setBannerBgImage(model: model) } diff --git a/MoviaBox/Class/Home/ViewModel/SPHomeViewModel.swift b/MoviaBox/Class/Home/ViewModel/SPHomeViewModel.swift index 72b9dd5..51702af 100644 --- a/MoviaBox/Class/Home/ViewModel/SPHomeViewModel.swift +++ b/MoviaBox/Class/Home/ViewModel/SPHomeViewModel.swift @@ -104,7 +104,7 @@ class SPHomeViewModel: NSObject { } var isEmptyData: Bool { - if dataArr.count > 0 || (playHistoryArr?.count ?? 0) > 0 || moduleModel != nil { + if dataArr.count > 0 || (playHistoryArr?.count ?? 0) > 0 || moduleModel != nil || categoryDataArr1.count > 0 || categoryDataArr2.count > 0 { return false } return true diff --git a/MoviaBox/Class/Player/Model/SPShortModel.swift b/MoviaBox/Class/Player/Model/SPShortModel.swift index 9fac89f..d780a8a 100644 --- a/MoviaBox/Class/Player/Model/SPShortModel.swift +++ b/MoviaBox/Class/Player/Model/SPShortModel.swift @@ -43,6 +43,9 @@ class SPShortModel: SPModel, SmartCodable { @IgnoredKey var sp_isSelected: Bool? + @IgnoredKey + var blurImage: UIImage? + static func mappingForKey() -> [SmartKeyTransformer]? { return [