Kingfisher 是一个轻量级、纯 Swift 实现的异步下载和缓存图片的库,github 介绍中提到了以下一些特性:
- 下载高分辨率的图像;
- 向下采样以匹配图像视图的大小;
- 使它在给定的半径内被旋转到倾斜;
- 在下载时显示进度指示器和占位符图像;
- 下载图像准备好后,会以“淡出”效果展示图像动画;
- 原始图像能被缓存到磁盘以供以后使用,方便在详细视图中等再次利用;
- 任务下载进行中进度、下载完成、下载失败都能提供自定义操作;
添加Kingfisher库
推荐 Swift Package Manager (SPM) 方式,如出现加载困难可阅读《 解决Xcode中SPM加载卡慢问题》
- File > Swift Packages > Add Package Dependency
- 右上角输入
https://github.com/onevcat/Kingfisher.git
- 选择 “Up to Next Major” -> “7.0.0”
- 确认导入
使用时需要使用 import
导入引用:
import Kingfisher
使用示例
import Kingfisher
let customDownloader = ImageDownloader(name: "MyImgDownloader")
let customCache = ImageCache(name: "offlineCache")
var body: some View {
KFImage(URL(string: "https://www.codeun.com/logo.png"))
// 调整渲染模式
.renderingMode(.template)
// 图像加载时展示默认占位图
.placeholder {
Image(systemName: "placeholder")
.resizable()
.scaledToFit()
.opacity(0.3)
}
// 也可以在图像加载时展示进度指示器
// .placeholder {
// ProgressView()
// }
// 加载完成后淡入效果
.fade(duration: 0.5)
// 使用缓存策略
.cacheMemoryOnly()
// 使用刷新策略
// .forceRefresh()
// 图像加载进度
.onProgress { receivedSize, totalSize in
print("总大小:\(totalSize) - 已接受:\(receivedSize)")
}
// 图像加载完成
.onSuccess { result in
print("\(result.image) - \(result.cacheType)")
}
.onFailure { error in
print("\(error)")
}
// 目标缓存
.targetCache(customCache)
// 使用自定义下载器
.downloader(customDownloader)
.resizable()
.scaledToFit()
.scaleEffect(0.9)
.animation(.easeInOut(duration: 0.5))
// 圆角
.clipShape(RoundedRectangle(cornerRadius: 12))
// 边框
.overlay(RoundedRectangle(cornerRadius: 12).stroke(Color.green, lineWidth: 2))
}
}
其他部分 API 说明
- 禁用磁盘缓存:
.memoryCacheExpiration(.never)
- 设置磁盘缓存有效期:
.diskCacheExpiration(.days(1))
- 设置加载图像优先级队列:
.downloadPriority(0.5)
- 设置重试策略:
.retryStrategy()
- 自定义缩略图大小:
.thumbnail(size: CGSize(width: 50, height: 50))
再来一个示例
自定义图片下载request请求设置 (header, Authorization, token 等)
根据网络状态设置 placeholder 和 缓存方式
@Environment(\.networkState) var networkState: NetworkState
let myDownloader = ImageDownloader(name: "myDownloader")
let myCache = ImageCache(name: "myCache")
let customKF = KingfisherManager(downloader: myDownloader, cache: myCache)
// 自定义图片下载request请求设置
let options: KingfisherOptionsInfo = [
.requestModifier(ImageDownloadRequestModifier(modify: { request in
var newRequest = request
newRequest.addValue("Bearer mock_token", forHTTPHeaderField: "Authorization")
newRequest.addValue("codeun_app", forHTTPHeaderField: "UserAgent")
return newRequest
}))
]
KFImage(URL(string: "https://example.com/image.jpg"))
.placeholder {
if networkState.isOffline {
Text("无法加载图片,请检查网络连接")
} else {
ProgressView()
}
}
.cacheStrategy(networkState.isOffline ? .memoryOnly : .default)
本文自 https://www.codeun.com 发布,相应代码均自主编写并严格审阅和测试,完整代码中包含丰富的学习笔记和使用方式、实用技巧。
· 如若转载,请注明出处:https://www.codeun.com/archives/1036.html ·