From 1807584f6d3ec6becfb864bf343adc023c217c32 Mon Sep 17 00:00:00 2001 From: zeng Date: Mon, 28 Apr 2025 13:48:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A6=96=E9=A1=B5=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=A8=A1=E7=B3=8A=E8=83=8C=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MoviaBox/Base/View/SPFadeEdgeImageView.swift | 80 +++++++++++++++++++ .../SPWebViewController+ScriptMessage.swift | 2 +- .../Class/Home/View/SPHomeHeaderView.swift | 27 ++++++- .../Class/Mine/View/SPMineHeaderView.swift | 6 +- MoviaBox/Libs/Login/SPLoginManager.swift | 16 ++++ .../ZKCycleScrollViewFlowLayout.swift | 2 +- 6 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 MoviaBox/Base/View/SPFadeEdgeImageView.swift diff --git a/MoviaBox/Base/View/SPFadeEdgeImageView.swift b/MoviaBox/Base/View/SPFadeEdgeImageView.swift new file mode 100644 index 0000000..7cbca92 --- /dev/null +++ b/MoviaBox/Base/View/SPFadeEdgeImageView.swift @@ -0,0 +1,80 @@ +// +// SPFadeEdgeImageView.swift +// MoviaBox +// +// Created by 佳尔 on 2025/4/28. +// + +import UIKit + +class SPFadeEdgeImageView: UIImageView { + + override var image: UIImage? { + didSet { + applyBlurAndEdgeFadeEffect() + } + } + + private var blurredImage: UIImage? + + override func layoutSubviews() { + super.layoutSubviews() + 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. 创建渐变蒙版(四周虚化) + let maskLayer = CAShapeLayer() + maskLayer.frame = bounds + + // 画一个圆形的反向路径,中心完全显示,四周渐变透明 + let path = UIBezierPath(rect: bounds) + let insetRect = bounds.insetBy(dx: bounds.width * 0.1, dy: bounds.height * 0.1) + let innerPath = UIBezierPath(roundedRect: insetRect, cornerRadius: 20) + path.append(innerPath) + path.usesEvenOddFillRule = true + + maskLayer.path = path.cgPath + maskLayer.fillRule = .evenOdd + + // 3. 创建径向渐变图层 + let gradientLayer = CAGradientLayer() + gradientLayer.frame = bounds + gradientLayer.colors = [ + UIColor.black.withAlphaComponent(1).cgColor, + UIColor.black.withAlphaComponent(0).cgColor + ] + gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.5) + gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0) + gradientLayer.locations = [0.5, 1] + gradientLayer.type = .radial + + // 4. 添加渐变蒙版到图片 + let containerLayer = CALayer() + containerLayer.frame = bounds + containerLayer.addSublayer(gradientLayer) + containerLayer.mask = maskLayer + + self.layer.mask = containerLayer + } + +} diff --git a/MoviaBox/Base/WebView/SPWebViewController+ScriptMessage.swift b/MoviaBox/Base/WebView/SPWebViewController+ScriptMessage.swift index de5ee0d..8c389ad 100644 --- a/MoviaBox/Base/WebView/SPWebViewController+ScriptMessage.swift +++ b/MoviaBox/Base/WebView/SPWebViewController+ScriptMessage.swift @@ -53,7 +53,7 @@ extension SPWebViewController { let data = model.data if type == "login" {//登录 - self.navigationController?.pushViewController(SPLoginViewController(), animated: true) + SPLoginManager.manager.openLoginVC() } else if type == "open_notify" {//打开通知 openNotify() diff --git a/MoviaBox/Class/Home/View/SPHomeHeaderView.swift b/MoviaBox/Class/Home/View/SPHomeHeaderView.swift index e689567..372e94f 100644 --- a/MoviaBox/Class/Home/View/SPHomeHeaderView.swift +++ b/MoviaBox/Class/Home/View/SPHomeHeaderView.swift @@ -13,6 +13,9 @@ class SPHomeHeaderView: UICollectionReusableView { didSet { let moduleModel = viewModel?.moduleModel + let bannerModel = self.viewModel?.moduleModel?.bannerData?.first + self.bannerBgImageView.sp_setImage(url: bannerModel?.image_url) + stackView.removeAllArrangedSubview() stackView.addArrangedSubview(bannerView) @@ -50,13 +53,19 @@ class SPHomeHeaderView: UICollectionReusableView { return view }() + private lazy var bannerBgImageView: SPFadeEdgeImageView = { + let imageView = SPFadeEdgeImageView() + imageView.contentMode = .scaleAspectFill + return imageView + }() + private lazy var bannerView: ZKCycleScrollView = { let view = ZKCycleScrollView(frame: .zero, shouldInfiniteLoop: true) view.itemSize = .init(width: 234, height: Self.bannerHeight()) view.itemAlpha = true view.itemZoomScale = 0.9 view.itemSpacing = 10 - view.rotationAngle = 5 + view.rotationAngle = 10 view.delegate = self view.dataSource = self view.hidesPageControl = true @@ -114,11 +123,20 @@ class SPHomeHeaderView: UICollectionReusableView { extension SPHomeHeaderView { private func _setupUI() { + addSubview(bannerBgImageView) addSubview(stackView) stackView.snp.makeConstraints { make in make.edges.equalToSuperview() } + + bannerBgImageView.snp.makeConstraints { make in +// make.top.equalTo(20) + make.top.equalToSuperview() + make.centerX.equalToSuperview() + make.width.equalTo(kSPScreenWidth) + make.height.equalTo(Self.bannerHeight()) + } } } @@ -162,6 +180,13 @@ extension SPHomeHeaderView: ZKCycleScrollViewDelegate, ZKCycleScrollViewDataSour return self.viewModel?.moduleModel?.bannerData?.count ?? 0 } + func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, didScrollFromIndex fromIndex: Int, toIndex: Int) { + let model = self.viewModel?.moduleModel?.bannerData?[toIndex] + + self.bannerBgImageView.sp_setImage(url: model?.image_url) + + } + func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, didSelectItemAt index: Int) { let model = self.viewModel?.moduleModel?.bannerData?[index] diff --git a/MoviaBox/Class/Mine/View/SPMineHeaderView.swift b/MoviaBox/Class/Mine/View/SPMineHeaderView.swift index d61cc4a..e8ab207 100644 --- a/MoviaBox/Class/Mine/View/SPMineHeaderView.swift +++ b/MoviaBox/Class/Mine/View/SPMineHeaderView.swift @@ -162,11 +162,7 @@ extension SPMineHeaderView { } @objc private func handleLoginButton() { - let vc = SPLoginViewController() - let nav = SPNavigationController(rootViewController: vc) - nav.modalPresentationStyle = .fullScreen - - self.viewController?.present(nav, animated: true) + SPLoginManager.manager.openLoginVC() } } diff --git a/MoviaBox/Libs/Login/SPLoginManager.swift b/MoviaBox/Libs/Login/SPLoginManager.swift index e767a12..18d16b4 100644 --- a/MoviaBox/Libs/Login/SPLoginManager.swift +++ b/MoviaBox/Libs/Login/SPLoginManager.swift @@ -27,6 +27,22 @@ class SPLoginManager: NSObject { token = UserDefaults.jx_object(forKey: kSPLoginTokenDefaultsKey, class: SPTokenModel.self) as? SPTokenModel } + ///判断登录状态,未登录打开登录页面 + func isLoginAndOpenLoginVC() -> Bool { +// if !isLogin { +// openLoginVC() +// } +// return isLogin + return false + } + + func openLoginVC() { + let vc = SPLoginViewController() + let nav = SPNavigationController(rootViewController: vc) + nav.modalPresentationStyle = .fullScreen + + SPAPPTool.topViewController()?.present(nav, animated: true) + } func setLoginToken(token: SPTokenModel?) { self.token = token diff --git a/MoviaBox/Thirdparty/ZKCycleScrollView-Swift/ZKCycleScrollViewFlowLayout.swift b/MoviaBox/Thirdparty/ZKCycleScrollView-Swift/ZKCycleScrollViewFlowLayout.swift index 65fc729..d202a2c 100644 --- a/MoviaBox/Thirdparty/ZKCycleScrollView-Swift/ZKCycleScrollViewFlowLayout.swift +++ b/MoviaBox/Thirdparty/ZKCycleScrollView-Swift/ZKCycleScrollViewFlowLayout.swift @@ -96,7 +96,7 @@ open class ZKCycleScrollViewFlowLayout: UICollectionViewFlowLayout { } if itemAlpha { - var alpha = 1 - abs(screenScale) + var alpha = 1 - abs(screenScale) + 0.2 if alpha < 0 { alpha = 0 } else if alpha > 1 {