SDWebImagePhotosPlugin

CI Status Version License Platform Carthage compatible SwiftPM compatible codecov

用途

SDWebImagePhotosPlugin 是 SDWebImage 框架的一个插件,它为 Photos Library 提供图像加载支持。

此插件允许您使用 SDWebImage 中您熟悉的 View Category 方法,通过 PHAssetlocalIdentifier 加载 Photos 图像。

要求

安装

CocoaPods

SDWebImagePhotosPlugin 可通过 CocoaPods 获得。 要安装它,只需将以下行添加到您的 Podfile 中

pod 'SDWebImagePhotosPlugin'

Carthage

SDWebImagePhotosPlugin 可通过 Carthage 获得。

github "SDWebImage/SDWebImagePhotosPlugin"

Swift Package Manager (Xcode 11+)

SDWebImagePhotosPlugin 可通过 Swift Package Manager 获得。

let package = Package(
    dependencies: [
        .package(url: "https://github.com/SDWebImage/SDWebImagePhotosPlugin.git", from: "1.0")
    ]
)

用法

重要提示! 要使用此 Photos Library 插件,您首先需要将 photos loader 注册到图像管理器。

有两种方法可以注册 photos loader。一种是临时使用(当提供的 URL 肯定是 Photos URL 而不是 HTTP URL 时),另一种是全局支持(不需要任何检查,同时支持 HTTP URL 和 Photos URL)。

使用自定义管理器(临时)

您可以创建一个自定义管理器以供临时使用。 当您使用自定义管理器时,请务必为 View Category 方法指定带有自定义管理器的 SDWebImageContextCustomManager 上下文选项。

// Assign loader to custom manager
SDWebImageManager *manager = [[SDWebImageManager alloc] initWithCache:SDImageCache.sharedImageCache loader:SDImagePhotosLoader.sharedLoader];
// Assign loader to custom manager
let manager = SDWebImageManager(cache: SDImageCache.shared, loader: SDImagePhotosLoader.shared)

使用loaders manager(全局)

您可以使用 loaders manager 替换默认管理器的 loader 实现,以全局支持 HTTP 和 Photos URL。 将这些代码放在应用程序启动时(或在 SDWebImageManager.sharedManager 初始化之前)。

// Supports HTTP URL as well as Photos URL globally
SDImageLoadersManager.sharedManager.loaders = @[SDWebImageDownloader.sharedDownloader, SDImagePhotosLoader.sharedLoader];
// Replace default manager's loader implementation
SDWebImageManager.defaultImageLoader = SDImageLoadersManager.sharedManager;
// Supports HTTP URL as well as Photos URL globally
SDImageLoadersManager.shared.loaders = [SDWebImageDownloader.shared, SDImagePhotosLoader.shared]
// Replace default manager's loader implementation
SDWebImageManager.defaultImageLoader = SDImageLoadersManager.shared

加载图像

要开始加载 Photos Library 图像,请使用 NSURL+SDWebImagePhotosPlugin 创建一个 Photos URL 并调用 View Category 方法。

// Create with `PHAsset`
PHAsset *asset;
NSURL *photosURL = asset.sd_URLRepresentation;
// The same as `[NSURL sd_URLWithAsset:asset];`
// Create with `localIdentifier`
NSString *identifier;
NSURL *potosURL = [NSURL sd_URLWithAssetLocalIdentifier:identifier];

// Load image (assume using custom manager)
[imageView sd_setImageWithURL:photosURL placeholderImage:nil context:@{SDWebImageContextCustomManager: manager}];
// Create with `PHAsset`
let asset: PHAsset
let photosURL = asset.sd_URLRepresentation
// The same as `NSURL.sd_URL(with: asset) as URL`
// Create with `localIdentifier`
let identifier: String
let potosURL = NSURL.sd_URL(withAssetLocalIdentifier: identifier) as URL

// Load image (assume using custom manager)
imageView.sd_setImage(with: photosURL, placeholderImage: nil, context: [.customManager: manager])

动画图像

SDWebImagePhotosPlugin 也支持存储在 Photos Library 中的 GIF 图像。 只需使用与普通图像相同的 API 来查询资源。 我们将查询图像数据并解码动画图像(与 UIImageView 以及 SDAnimatedImageView 兼容)

视频资源

SDWebImagePhotosPlugin 也支持加载视频资源的封面。 默认情况下,我们不允许非图像类型的资源,以避免意外选择了错误的资源。 但是您也可以禁用此限制。

SDImagePhotosLoader.sharedLoader.requestImageAssetOnly = NO;
SDImagePhotosLoader.shared.requestImageAssetOnly = false

然后只需请求 PHAssets 或使用获取选项,其中媒体类型为 .video

获取/请求选项

要指定 Photos Library 的选项,例如 PHFetchOptionsPHImageRequestOptions。 要么更改 loader 中的对应属性,要么为每个图像请求提供上下文选项。

// loader-level options
// ignore iCloud Shared Album (`localIdentifier` Photos URL only)
PHFetchOptions *fetchOptions = [PHFetchOptions new];
fetchOptions.predicate = [NSPredicate predicateWithFormat:@"sourceType != %d", PHAssetSourceTypeCloudShared];
SDImagePhotosLoader.sharedLoader.fetchOptions = fetchOptions;

// request-level options
// allows iCloud Photos Library
PHImageRequestOptions *requestOptions = [PHImageRequestOptions new];
requestOptions.networkAccessAllowed = YES;
[imageView sd_setImageWithURL:photosURL placeholderImage:nil context:@{SDWebImageContextPhotosImageRequestOptions: requestOptions, SDWebImageContextCustomManager: manager}];
// loader-level options
// ignore iCloud Shared Album (`localIdentifier` Photos URL only)
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "sourceType != %d", PHAssetSourceType.typeCloudShared.rawValue)
SDImagePhotosLoader.shared.fetchOptions = fetchOptions

// request-level options
// allows iCloud Photos Library
let requestOptions = PHImageRequestOptions()
requestOptions.networkAccessAllowed = true
imageView.sd_setImage(with: photosURL, placeholderImage: nil, context:[.photosImageRequestOptions: requestOptions, .customManager: manager])

控制查询图像大小

iPhone 相机拍摄的照片可能具有非常大的像素尺寸 (4K+)。 因此,如果您想加载大型 Photos Library 资源以进行渲染,您应该使用有限的大小指定目标大小(例如,您要加载到的 imageView 的大小)。

默认情况下,我们查询与原始图像最大尺寸匹配的目标尺寸(参见:PHImageManagerMaximumSize),这可能会消耗 iOS 设备上过多的内存。 还有两个内置的动态值 SDWebImagePhotosPixelSize/SDWebImagePhotosPointSize 适用于某些情况。

您可以通过使用 PHImageRequestOptions.sd_targetSize 或通过 .imageThumbnailPixelSize 上下文选项使用 缩略图解码来更改获取图像大小。

全局控制查询图像大小限制

SDImagePhotosLoader.sharedLoader.imageRequestOptions.sd_targetSize = CGSizeMake(1000, 1000); // Limit 1000x1000 pixels
SDImagePhotosLoader.shared.imageRequestOptions.sd_targetSize = CGSize(width: 1000, height: 1000) // Limit 1000x1000 pixels

控制单个资产的查询图像大小

UIImageView *imageView;
PHAsset *asset;
NSURL *url = asset.sd_URLRepresentation;
[imageView.sd_setImageWithURL:url options:0 context:@{SDWebImageContextImageThumbnailPixelSize: @(imageView.bounds.size)}]; // Fetch image based on image view size
let imageView: UIImageView
let asset: PHAsset
let url = asset.sd_URLRepresentation
imageView.sd_setImage(with: url, context: [.imageThumbnailPixelSize : imageView.bounds.size]) // Fetch image based on image view size

注意:您还可以使用如上所示的 SDWebImageContextPhotosImageRequestOptions。 但是缩略图像素大小也可以用于正常的网络 URL,这可以帮助您统一 HTTP URL 和 PHAsset URL 的逻辑。

提示

  1. Photos Library 中的图像已经存储在设备磁盘上,并且查询速度对于小分辨率图像来说足够快,因此缓存存储可能是不必要的。 您可以使用 SDWebImageContextStoreCacheTypeSDImageCacheTypeNone 来禁用缓存存储,并使用 SDWebImageFromLoaderOnly 来禁用缓存查询。
  2. 如果您使用 PHImageRequestOptionsDeliveryModeOpportunistic (default) 加载图像,PhotosKit 将首先返回降级的缩略图图像,然后再次返回完整像素图像。 当图像降级时,loader 完成块将设置 finished = NO。 但是,这不会触发 View Category 完成块,只会触发图像刷新(例如使用 SDWebImageProgressiveLoad 的网络图像的渐进式加载行为)
  3. 默认情况下,我们将首选使用 Photos requestImageForAsset:targetSize:contentMode:options:resultHandler: API 处理普通图像,使用 requestImageDataForAsset:options:resultHandler: 处理动画图像,如 GIF 资源。 如果您需要原始图像数据以进行进一步的图像处理,您可以始终传递 SDWebImageContextPhotosRequestImageData 上下文选项以强制使用请求数据 API。 请注意,当请求数据时,targetSizecontentMode 选项将被忽略。 如果您需要较小的图像尺寸,请考虑使用 SDWebImage 5.0 的 Image Transformer 功能。

演示

如果您在使用方面遇到一些问题,SDWebImagePhotosPlugin 提供了 iOS 和 macOS 平台的演示。 要运行演示,请克隆 repo 并运行以下命令。

cd Example/
pod install
open SDWebImagePhotosPlugin.xcworkspace

打开 Xcode 项目后,单击 运行 以构建并运行演示。

作者

DreamPiggy, lizhuoli1126@126.com

许可证

SDWebImagePhotosPlugin 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。