Swift中如何在Kingfisher库中使用AspectScaledToFitAndCenterSizeFilter滤镜
你原本的自定义滤镜遵循的是AlamofireImage的ImageFilter协议,Kingfisher使用独立的ImageProcessor协议来处理图片加工逻辑,所以需要先调整你的自定义结构体适配Kingfisher规则,再在调用时传入即可。
1. 调整自定义滤镜结构体
替换原来的协议声明,适配Kingfisher的ImageProcessor要求:
import Kingfisher struct AspectScaledToFitAndCenterSizeFilter: ImageProcessor { /// 尺寸参数 let size: CGSize /// Kingfisher要求的唯一标识符,用于缓存区分,必须包含所有影响处理结果的参数 /// 建议将前缀替换为你自己的项目标识,避免和其他第三方处理器重名 var identifier: String { "com.your.project.AspectScaledToFitAndCenterSizeFilter-size-\(size.width)-\(size.height)" } init(size: CGSize) { self.size = size } /// 实现Kingfisher的图片处理逻辑 func process(item: ImageProcessItem, options: KingfisherParsedOptionsInfo) -> KFCrossPlatformImage? { switch item { case .image(let image): // 复用你原来的图片处理逻辑 return image.imageAspectScaledAndCenter(toFit: self.size) case .data: // 先把数据转成UIImage再处理 guard let originalImage = DefaultImageProcessor.default.process(item: item, options: options) else { return nil } return originalImage.imageAspectScaledAndCenter(toFit: self.size) } } }
如果需要同时兼容AlamofireImage,在结构体声明时同时遵循两个协议即可,不需要重复写处理逻辑。
2. 调用时传入滤镜
在kf.setImage方法中通过options参数的processor配置项传入你的滤镜实例即可:
let filter = AspectScaledToFitAndCenterSizeFilter(size: imageSize) imageView.kf.setImage( with: imageURL.mediaURL(), placeholder: UIImage(imageLiteralResourceName: "icMissingEntreeGrid"), options: [.processor(filter)] )
内容的提问来源于stack exchange,提问作者ios
相关产品推荐
相关产品推荐

