增加首页图片模糊背景

This commit is contained in:
zeng 2025-04-28 13:48:12 +08:00
parent 153c8ac080
commit 1807584f6d
6 changed files with 125 additions and 8 deletions

View File

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

View File

@ -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()

View File

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

View File

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

View File

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

View File

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