此库提供一个具有缓存支持的异步图像下载器。为了方便,我们为 UI 元素(如 UIImageView
、UIButton
、MKAnnotationView
)添加了分类。
注意:SD
是 简单设计(Simple Design) 前缀,这是作者 Olivier Poitrey 所在的 Daily Motion 公司团队名称。
功能
- 为
UIImageView
、UIButton
、MKAnnotationView
添加网络图像和缓存管理分类 - 异步图像下载器
- 异步内存+磁盘图像缓存,带有自动缓存过期处理
- 后台图像解压缩以避免帧率下降
- 渐进式图像加载(包括浏览器中显示的动画图像,如 GIF)
- 缩略图图像解码以节省大图像的 CPU 和内存
- 可扩展图像编码器以支持大量的图像格式,如 WebP
- 动画图像的全栈解决方案,在 CPU 和内存之间保持平衡
- 可自定义的组合变换可以在下载后立即应用于图像
- 可自定义和多个缓存系统
- 可自定义和多个加载系统以扩展功能,比如 Photos Library
- 图像加载指示器
- 图像加载过渡动画
- 保证相同的 URL 不会被多次下载
- 保证虚假的 URL 不会反复重试
- 保证主线程永远不会被阻塞
- 现代 Objective-C 和更好的 Swift 支持
- 性能!
支持的图像格式
- 苹果系统支持的图像格式(JPEG,PNG,TIFF,BMP等),包括GIF/APNG 动态图像
- iOS 11/macOS 10.13的HEIC格式,包括通过SDWebImageHEICCoder的iOS 13/macOS 10.15的可动HEIC。对于早期固件,请使用编码器插件SDWebImageHEIFCoder
- iOS 14/macOS 11.0的WebP格式,通过SDWebImageAWebPCoder。对于早期固件,请使用编码器插件 SDWebImageWebPCoder
- 支持可扩展的编码器插件,用于支持新的图像格式,如BPG、AVIF。还支持矢量格式,如PDF、SVG。请参阅图像编码器插件列表
附加模块和生态系统
为了保持SDWebImage的专注和核心功能的局限性,同时允许扩展和自定义行为,在5.0重构期间,我们专注于模块化库。因此,我们将新建模块移动/构建到SDWebImage org。
SwiftUI
SwiftUI 是一门使用 Swift 编写的创新 UI 框架,用于在所有 Apple 平台上构建用户界面。
我们通过构建一个名为 SDWebImageSwiftUI 的新框架来支持 SwiftUI,该框架建立在 SDWebImage 核心功能(缓存、加载和动画)的基础上。
新框架引入了两个视图结构 WebImage
和 AnimatedImage
,以供 SwiftUI 世界使用,以及 ImageIndicator
修饰符用于任何视图,还有一个用于数据源的可观察对象 ImageManager
。支持 iOS 13+/macOS 10.15+/tvOS 13+/watchOS 6+ 和 Swift 5.1。试试看并给我们反馈!
支持更多图像格式的编解码器
- SDWebImageWebPCoder - WebP格式编解码器。支持iOS 8+/macOS 10.10+。基于libwebp
- SDWebImageHEIFCoder - HEIF格式编解码器,iOS 8+/macOS 10.10+支持。基于libheif
- SDWebImageBPGCoder - BPG格式编解码器。基于libbpg
- SDWebImageFLIFCoder - FLIF格式编解码器。基于libflif
- SDWebImageAVIFCoder - AVIF(基于AV1)格式编解码器。基于libavif
- SDWebImagePDFCoder - PDF矢量格式编解码器。使用内置框架
- SDWebImageSVGCoder - SVG矢量格式编解码器。使用内置框架
- SDWebImageSVGNativeCoder - SVG-Native矢量格式编解码器。基于svg-native
- SDWebImageLottieCoder - Lottie动画格式编解码器。基于rlottie
- 以及来自社区的其他内容!
自定义缓存
- SDWebImageYYPlugin - 插件以支持使用YYCache缓存图像
- SDWebImagePINPlugin - 插件以支持使用PINCache缓存图像
自定义加载器
- SDWebImagePhotosPlugin - 插件以支持从Photos(使用
Photos.framework
)加载数据 - SDWebImageLinkPlugin - 支持从富链接URL加载图片的插件,以及
LPLinkView
(使用LinkPresentation.framework
)
与第三方库集成
- SDWebImageLottiePlugin - 支持从远程JSON文件渲染矢量动画的插件 Lottie-iOS
- SDWebImageSVGKitPlugin - 支持使用Core Animation渲染SVG的插件 SVGKit,iOS 8+/macOS 10.10+支持
- SDWebImageFLPlugin - 使用 FLAnimatedImage 作为动态GIF引擎的插件
- SDWebImageYYPlugin - 集成 YYImage & YYCache 用于图片渲染和缓存的插件
社区驱动的流行库
- FirebaseUI - 基于SDWebImage加载系统的Firebase存储查询图像绑定
- react-native-fast-image - 基于SDWebImage动画图像解决方案的React Native快速图像组件
- flutter_image_compress - 基于SDWebImage WebP编解码器插件的Flutter压缩图像插件
让我们的生活变得更简单
- libwebp-Xcode - libwebp的包装,以及一个Xcode项目。
- libheif-Xcode - libheif的包装,以及一个Xcode项目。
- libavif-Xcode - libavif的包装,以及一个Xcode项目。
- 和更多带有CocoaPods/Carthage/SwiftPM支持的第三方C/C++图像编解码库。
你可以直接使用这些组件,或者使用SDWebImage的可定制架构创建自己的类似组件。
需求
- iOS 9.0 或更高版本
- tvOS 9.0 或更高版本
- watchOS 2.0 或更高版本
- macOS 10.11 或更高版本(Catalyst要求10.15)
- Xcode 11.0 或更高版本
向后兼容性
- 对于iOS 8、macOS 10.10 或 Xcode < 11,请使用 任何 5.x 版本直至 5.9.5
- 对于iOS 7、macOS 10.9 或 Xcode < 8,请使用 任何 4.x 版本直至 4.4.6
- 对于macOS 10.8,请使用 任何 4.x 版本直至 4.3.0
- 对于iOS 5 和 6,请使用 任何 3.x 版本直至 3.7.6
- 对于iOS < 5.0,请使用最后发布的 2.0 版本。
开始使用
- 阅读这份Readme文档
- 阅读 如何使用部分
- 阅读 最新文档 和 旧版CocoaDocs
- 从Github下载项目或使用CocoaPods(尝试
pod try SDWebImage
)来尝试示例 - 阅读 安装指南
- 阅读 SDWebImage 5.0 迁移指南 以了解4.x到5.x的变化
- 阅读 SDWebImage 4.0 迁移指南 以了解3.x到4.x的变化
- 阅读 常见问题 以找到常见问题的解决方案
- 访问 Wiki页面 了解更多信息,例如 高级用法
谁在使用它
- 了解谁在使用 SDWebImage,并将您的应用程序添加到列表中。谁在使用 SDWebImage
沟通
- 如果您需要帮助,请使用 Stack Overflow。 (标签 'sdwebimage')
- 如果您想询问一般问题,请使用 Stack Overflow。
- 如果您发现了bug,请提交一个问题。
- 如果您有功能请求,请提交一个问题。
- 如果您需要IRC频道,请使用 Gitter。
贡献
如何使用
- Objective-C
#import <SDWebImage/SDWebImage.h>
...
[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
- Swift
import SDWebImage
imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png"))
- 有关如何使用库和清晰的示例的详细信息,请参阅详细的如何使用指南
支持动画图像(GIF)
在5.0版本中,我们引入了一种支持动画图像的全新机制。这包括动画图像的加载、渲染、解码以及支持个性化设置(适用于高级用户)。
此动画图像解决方案适用于iOS/tvOS/macOS。SDAnimatedImage是UIImage/NSImage的子类,SDAnimatedImageView是UIImageView/NSImageView的子类,以便与常见框架API兼容。
SDAnimatedImageView支持熟悉的图像加载类别方法,类似于对UIImageView/NSImageView的即时替换。
没有UIView(如WatchKit或CALayer)?您仍然可以使用SDAnimatedPlayer,这是一种用于高级播放和渲染的播放引擎。
有关更多详细信息,请参阅动画图像。
- Objective-C
SDAnimatedImageView *imageView = [SDAnimatedImageView new];
SDAnimatedImage *animatedImage = [SDAnimatedImage imageNamed:@"image.gif"];
imageView.image = animatedImage;
- Swift
let imageView = SDAnimatedImageView()
let animatedImage = SDAnimatedImage(named: "image.gif")
imageView.image = animatedImage
FLAnimatedImage的集成有自己的专用仓库
为了整理代码并将核心项目的工作范围缩减,我们决定FLAnimatedImage的集成不应该放在这里。从5.0版本开始,这个功能仍然可用,但将放置在专用仓库SDWebImageFLPlugin中。
安装
有四种方法可以将SDWebImage应用到您的项目中
- 使用CocoaPods
- 使用Carthage
- 使用Swift包管理器
- 手动安装(构建框架或嵌入Xcode项目)
使用 CocoaPods 安装
CocoaPods 是 Objective-C 的依赖管理工具,它自动化并简化了在项目中使用第三方库的过程。有关详细信息,请参阅入门部分。
Podfile
platform :ios, '8.0'
pod 'SDWebImage', '~> 5.0'
Swift 和静态框架
Swift 项目之前必须使用 use_frameworks!
将所有 Pods 转换为动态框架,以使 CocoaPods 的工作得以进行。
但是,从 CocoaPods 1.5.0+
开始(需与 Xcode 9+
一起使用),它支持将 Objective-C 和 Swift 代码构建为静态框架。您可以使用模块头文件来使用 SDWebImage 作为静态框架,无需使用 use_frameworks!
platform :ios, '8.0'
# Uncomment the next line when you want all Pods as static framework
# use_modular_headers!
pod 'SDWebImage', :modular_headers => true
更多信息请见CocoaPods 1.5.0 — Swift 静态库
如果不这样做,您仍需要添加 use_frameworks!
才能将 SDWebImage 作为动态框架使用
platform :ios, '8.0'
use_frameworks!
pod 'SDWebImage'
子规格
目前有以下两种子规格可供选择:Core
和 MapKit
(这意味着您可以只安装 SDWebImage 的一些模块。默认情况下,您只获得 Core
,因此如果需要 MapKit
,您需要指定它)。
Podfile 示例
pod 'SDWebImage/MapKit'
使用 Carthage 安装
Carthage 是为 Swift 和 Objective-C 设计的一个轻量级依赖管理器。它利用了 CocoaTouch 模块,并且比 CocoaPods 具有更少的侵入性。
要使用 Carthage 进行安装,请按照 Carthage 的说明进行操作。
Carthage 用户可以指向此仓库并使用它们喜欢的任何生成的框架:SDWebImage、SDWebImageMapKit 或两者都使用。
在您的 Cartfile 中添加以下条目:github "SDWebImage/SDWebImage"
然后运行 carthage update
。如果您是第一次在项目中使用 Carthage,您需要按照 Carthage 解释的方式进行一些额外的步骤。
注意:目前,Carthage 无法提供仅构建特定仓库子组件的方法(或与 CocoaPods 的 subspecs 相当)。所有组件及其依赖项将按照上述命令进行构建。但是,您不需要将您未使用的框架复制到项目。例如,如果您没有使用
SDWebImageMapKit
,可以在carthage update
完成后从 Carthage Build 目录中删除该框架。
使用 Swift Package Manager(Xcode 11+)安装
Swift Package Manager(SwiftPM)是一个用于管理 Swift 代码以及 C 家族依赖的工具。从 Xcode 11 开始,SwiftPM 得到了 Xcode 的原生集成。
SDWebImage 从版本 5.1.0 开始支持 SwiftPM。要使用 SwiftPM,您应该使用 Xcode 11 打开您的项目。点击 文件
-> Swift 包
-> 添加包依赖关系
,输入 SDWebImage 仓库的 URL。或者,您可以使用 GitHub 账户登录 Xcode,仅输入 SDWebImage
进行搜索。
在选择包后,您可以选择依赖类型(标记版本、分支或提交)。然后 Xcode 将为您设置所有内容。
如果您是框架作者并使用 SDWebImage 作为依赖,更新您的 Package.swift
文件。
let package = Package(
// 5.1.0 ..< 6.0.0
dependencies: [
.package(url: "https://github.com/SDWebImage/SDWebImage.git", from: "5.1.0")
],
// ...
)
手动安装指南
访问的手动安装指南以了解更多信息
在源文件中导入头文件
在需要使用该库的源文件中,导入总的头文件
#import <SDWebImage/SDWebImage.h>
还建议使用模块导入语法,该语法适用于CocoaPods(启用 modular_headers
)/Carthage/SwiftPM。
@import SDWebImage;
构建项目
此时你的工作区间应该可以无错误地构建。如果你遇到问题,请在问题区域发帖,社区可以帮你解决这个问题。
数据收集实践
根据App Store中对应用程序隐私详情的要求,以下是SDWebImage的数据收集实践列表。
作者
贡献者
致谢
感谢所有为 SDWebImage 做出贡献的人们。
许可证
所有源代码均受 MIT 许可证 的许可。
架构
有关 SDWebImage 架构设计贡献的相关信息,请阅读 SDWebImage v5.6 架构核心。感谢 @looseyi 提供文章和翻译。