ThimraTV/MoviaBox/Base/View/SPFadeEdgeImageView.swift
2025-04-28 13:48:12 +08:00

81 lines
2.6 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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