增加首页图片模糊背景
This commit is contained in:
parent
153c8ac080
commit
1807584f6d
80
MoviaBox/Base/View/SPFadeEdgeImageView.swift
Normal file
80
MoviaBox/Base/View/SPFadeEdgeImageView.swift
Normal 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
|
||||
}
|
||||
|
||||
}
|
@ -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()
|
||||
|
@ -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]
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user