首页性能优化

This commit is contained in:
zeng 2025-06-19 09:50:44 +08:00
parent eea76fabfc
commit 84689e7ade
6 changed files with 95 additions and 31 deletions

View File

@ -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
}
}

View File

@ -9,11 +9,35 @@ import UIKit
class SPFadeEdgeImageView: UIImageView { class SPFadeEdgeImageView: UIImageView {
override var image: UIImage? { // override var image: UIImage? {
didSet { // didSet {
applyBlurAndEdgeFadeEffect() //
} // 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? private var blurredImage: UIImage?
@ -23,24 +47,6 @@ class SPFadeEdgeImageView: UIImageView {
} }
private func applyBlurAndEdgeFadeEffect() { 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. // 2.
let maskLayer = CAShapeLayer() let maskLayer = CAShapeLayer()

View File

@ -200,22 +200,27 @@ extension SPHomeViewController {
private func setEmptyView() { private func setEmptyView() {
if SPNetworkReachabilityManager.manager.isReachable != true { if SPNetworkReachabilityManager.manager.isReachable != true {
self.addNoNetworkEmptyView { [weak self] in 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() { @objc private func reachabilityDidChangeNotification() {
updateEmptyState() updateEmptyState()
if viewModel.isEmptyData, SPNetworkReachabilityManager.manager.isReachable == true {
self.updateAllData(completer: nil)
}
} }
/// ///
private func updateEmptyState() { private func updateEmptyState() {
if SPNetworkReachabilityManager.manager.isReachable == true { if SPNetworkReachabilityManager.manager.isReachable == true {
self._setupUI() self._setupUI()
if viewModel.isEmptyData {
self.updateAllData(completer: nil)
}
self.removeNoNetworkEmptyView() self.removeNoNetworkEmptyView()
} }
} }

View File

@ -14,7 +14,8 @@ class SPHomeHeaderView: UICollectionReusableView {
let moduleModel = viewModel?.moduleModel let moduleModel = viewModel?.moduleModel
let bannerModel = self.viewModel?.moduleModel?.bannerData?.first let bannerModel = self.viewModel?.moduleModel?.bannerData?.first
self.bannerBgImageView.sp_setImage(url: bannerModel?.image_url) setBannerBgImage(model: bannerModel)
stackView.removeAllArrangedSubview() stackView.removeAllArrangedSubview()
@ -64,6 +65,8 @@ class SPHomeHeaderView: UICollectionReusableView {
} }
} }
private var currentBannerModel: SPShortModel?
var isDidAppear: Bool = false { var isDidAppear: Bool = false {
didSet { didSet {
self.categoryVideoView1.isDidAppear = isDidAppear self.categoryVideoView1.isDidAppear = isDidAppear
@ -159,6 +162,25 @@ class SPHomeHeaderView: UICollectionReusableView {
fatalError("init(coder:) has not been implemented") 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 { extension SPHomeHeaderView {
@ -223,8 +245,7 @@ extension SPHomeHeaderView: ZKCycleScrollViewDelegate, ZKCycleScrollViewDataSour
func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, didScrollFromIndex fromIndex: Int, toIndex: Int) { func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, didScrollFromIndex fromIndex: Int, toIndex: Int) {
let model = self.viewModel?.moduleModel?.bannerData?[toIndex] let model = self.viewModel?.moduleModel?.bannerData?[toIndex]
setBannerBgImage(model: model)
self.bannerBgImageView.sp_setImage(url: model?.image_url)
} }

View File

@ -104,7 +104,7 @@ class SPHomeViewModel: NSObject {
} }
var isEmptyData: Bool { 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 false
} }
return true return true

View File

@ -43,6 +43,9 @@ class SPShortModel: SPModel, SmartCodable {
@IgnoredKey @IgnoredKey
var sp_isSelected: Bool? var sp_isSelected: Bool?
@IgnoredKey
var blurImage: UIImage?
static func mappingForKey() -> [SmartKeyTransformer]? { static func mappingForKey() -> [SmartKeyTransformer]? {
return [ return [