首页性能优化
This commit is contained in:
parent
eea76fabfc
commit
84689e7ade
29
MoviaBox/Base/Extension/UIImage+SPAdd.swift
Normal file
29
MoviaBox/Base/Extension/UIImage+SPAdd.swift
Normal 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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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()
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user