You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:24:01