ios - 如何在 swift 中使用 kingFisher 库中的 AspectScaledToFitAndCenterSizeFilter
问题描述
在我的项目中,我在 swift 中使用 AlamofireImage。现在我们用 KingFisher 库替换了 AlamofireImage。我使用下面创建了一个结构来适应过滤器
struct AspectScaledToFitAndCenterSizeFilter: ImageFilter, Sizable {
/// The size of the filter.
let size: CGSize
/// Initializes the `AspectScaledToFitSizeFilter` instance with the given size.
///
/// - parameter size: The size.
///
/// - returns: The new `AspectScaledToFitSizeFilter` instance.
init(size: CGSize) {
self.size = size
}
/// The filter closure used to create the modified representation of the given image.
var filter: (UIImage) -> UIImage {
{ image in
image.imageAspectScaledAndCenter(toFit: self.size)
}
}
}
当我们使用 AlmofireImage 时,使用以下代码设置图像 url
imageView.af.setImage(withURL: imageURL.mediaURL(), placeholderImage: #imageLiteral(resourceName: "icMissingEntreeGrid"), filter: AspectScaledToFitAndCenterSizeFilter(size: imageSize))
现在我将代码替换为
imageView.kf.setImage(with: imageURL.mediaURL(), placeholder: imageLiteral(resourceName: "icMissingEntreeGrid"))
但是如何使用 KingFisher 库添加“AspectScaledToFitAndCenterSizeFilter(size: imageSize)”。任何人都可以在这里帮助我。提前致谢。
解决方案
要创建 Kingfisher 图像处理器,您需要实现ImageProcessor
协议:
class AspectScaledToFitAndCenterSizeFilter: ImageProcessor {
/// Identifier of the processor.
/// - Note: See documentation of `ImageProcessor` protocol for more.
let identifier: String
/// The size of the filter.
let size: CGSize
/// Initializes the `AspectScaledToFitSizeFilter` instance with the given size.
///
/// - parameter size: The size.
///
/// - returns: The new `AspectScaledToFitSizeFilter` instance.
init(size: CGSize) {
self.size = size
identifier = "com.package.AspectScaledToFitAndCenterSizeFilter(\(size))"
}
func process(item: ImageProcessItem, options: KingfisherParsedOptionsInfo) -> KFCrossPlatformImage? {
switch item {
case .image(let image):
return image.imageAspectScaledAndCenter(toFit: self.size)
case .data:
return (DefaultImageProcessor.default |> self).process(item: item, options: options)
}
}
}
用法:
imageView.kf.setImage(
with: imageURL.mediaURL(),
placeholder: #imageLiteral(resourceName: "icMissingEntreeGrid"),
options: [
.processor(AspectScaledToFitAndCenterSizeFilter(size: .zero))
]
)
在文档中查看更多处理器用法。
推荐阅读
- javascript - 如何将样式属性删除到段落内的其他标签并仅保留一个样式
- spring-boot - Springboot 验证在 Kotlin 中不起作用
- python - 如何在 python 中从一组具有序列化命名的变量创建列表
- python - 在任何地方运行 python 脚本
- c++ - 将成对向量插入 unordered_map 时 C++ 缺少元素
- flutter - Flutter GridView.builder 不可滚动
- c++ - 转换返回值时的 RVO
- c++ - 为什么线程清理程序抱怨这个 std::ranges::views::filter 代码?
- javascript - Promise 构造函数是否需要 resolve 函数?
- python - AttributeError:“NoneType”对象没有属性“get”(MongoDB 和 Django)