// // SPFadeEdgeImageView.swift // MoviaBox // // Created by 佳尔 on 2025/4/28. // import UIKit class SPFadeEdgeImageView: UIImageView { // override var image: UIImage? { // didSet { // // 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? override func layoutSubviews() { super.layoutSubviews() applyBlurAndEdgeFadeEffect() } private func applyBlurAndEdgeFadeEffect() { // 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 } }