ZSCornerRadius 0.0.4

ZSCornerRadius 0.0.4

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布上次发布2016年8月

“Kael_zzs”维护。



  • 作者:
  • Kael

网络图片

Dependency Status Reference Status

此库为UIImageView提供了一个类别,支持从网络上获取的远程图片。

它提供了

  • 为Cocoa Touch框架添加了网络图片和缓存管理的UIImageView类别
  • 异步图片下载器
  • 异步内存 + 磁盘图片缓存,并自动处理缓存过期
  • 支持动画GIF
  • 支持WebP格式
  • 后台图像解压缩
  • 确保相同的URL不会被多次下载
  • 确保无效的URL不会被反复重试
  • 确保主线程永远不会被阻塞
  • 性能!
  • 使用GCD和ARC
  • 支持Arm64

注意:SDWebImage 3.8版本需要iOS 7或更高版本(因为NSURLSession)。3.7到3.0版本需要iOS 5.1.1。如果您需要iOS < 5.0的支持,请使用最后一个2.0版本

为什么SDWebImage优于X?

谁使用它

查找使用SDWebImage的用户,并将您的应用程序添加到列表中。

如何使用

API文档可在CocoaDocs - SDWebImage找到

在UITableView中使用UIImageView+WebCache类别

只需导入头文件,并在UITableView的dataSource的tableView:cellForRowAtIndexPath:方法中调用sd_setImageWithURL:placeholderImage:方法。从异步下载到缓存管理,一切都会为您处理。

#import <SDWebImage/UIImageView+WebCache.h>

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:MyIdentifier] autorelease];
    }

    // Here we use the new provided sd_setImageWithURL: method to load the web image
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

    cell.textLabel.text = @"My Text";
    return cell;
}

使用blocks

使用blocks,您可以在图像下载进度通知和图像检索完成时被通知,无论成功与否

// Here we use the new provided sd_setImageWithURL: method to load the web image
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                ... completion code here ...
                             }];

注意:如果您的图像请求在完成之前被取消,则不会调用您的成功或失败块。

使用SDWebImageManager

SDWebImageManager是UIImageView+WebCache类后面的类。它将异步下载器与图像缓存存储绑定在一起。您可以直接使用此类来自不同上下文(例如Cocoa)中受益于具有缓存的网络图片下载。

以下是如何使用SDWebImageManager的简单示例

SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:imageURL
                      options:0
                     progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                         // progression tracking code
                     }
                     completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
                         if (image) {
                             // do something with image
                         }
                     }];

独立使用异步图像下载器

还可以独立使用异步图片下载器。

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
[downloader downloadImageWithURL:imageURL
                         options:0
                        progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                            // progression tracking code
                        }
                       completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
                            if (image && finished) {
                                // do something with image
                            }
                        }];

独立使用异步图像缓存

也可以独立使用基于异步的图像缓存存储。SDImageCache 维护一个内存缓存和可选的磁盘缓存。磁盘缓存写入操作是异步进行的,因此不会对 UI 增加不必要的延迟。

SDImageCache 类提供了一个单例实例以便于使用,但如果你想创建一个独立的缓存命名空间,可以创建自己的实例。

要查找缓存,您使用 queryDiskCacheForKey:done: 方法。如果此方法返回 nil,则表示缓存当前不拥有该图像。因此,您负责生成和缓存它。缓存键是缓存图像的应用程序唯一标识符。通常是图像的绝对 URL。

SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"];
[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) {
    // image is not nil if image was found
}];

默认情况下,如果内存缓存中没有找到图像,SDImageCache 会查找磁盘缓存。您可以通过调用替代方法 imageFromMemoryCacheForKey: 来防止这种情况发生。

要存储图像到缓存,您使用 storeImage:forKey: 方法。

[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];

默认情况下,图像会存储在内存缓存以及磁盘缓存中(异步)。如果只想在内存缓存中存储,请使用带负数第三个参数的替代方法 storeImage:forKey:toDisk:

使用缓存键筛选器

有时,您可能不想使用图像 URL 作为缓存键,因为 URL 的一部分是动态的(例如:为了访问控制目的)。SDWebImageManager 提供了一种设置缓存键筛选器的方式,该筛选器接受 NSURL 作为输入,并输出一个缓存键 NSString。

以下示例设置了一个筛选器,在应用程序代理中移除 URL 中的任何查询字符串,然后再将其用作缓存键。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
        url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
        return [url absoluteString];
    };

    // Your app init code...
    return YES;
}

常见问题

使用 UITableViewCell 中的动态图像大小

UITableView 通过单元格的第一个图像集合确定图像的大小。如果远程图像与您占位符图像的大小不同,您可能会遇到奇怪的畸变缩放问题。以下文章提供了一种绕过此问题的方法:

http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/

处理图像刷新

默认情况下,SDWebImage 由默认的非常积极的缓存。它忽略了 HTTP 服务器返回的所有类型的缓存控制头,并以无时间限制的方式缓存返回的图像。这意味着您的图像 URL 是静态 URL,指向永远不会更改的图像。如果指向的图像意外更改,URL 的一部分也应该相应更改。

如果您无法控制所使用的图像服务器,您可能无法在内容更新时更改 URL。例如,对于 Facebook 头像 URL 来说就是这样。在这种情况下,您可以使用 SDWebImageRefreshCached 标志。这将略微降低性能,但会尊重 HTTP 缓存控制头。

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
                 placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                          options:SDWebImageRefreshCached];

添加进度指示器

请参阅此分类: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage

安装

有三种方法可以在您的项目中使用 SDWebImage:

  • 使用 CocoaPods
  • 将所有文件复制到您的项目中
  • 将项目导入为静态库

Podfile

platform :ios, '7.0'
pod 'SDWebImage', '~>3.8'

如果你使用Swift,请确保添加 use_frameworks! 并将目标设置为iOS 8+

platform :ios, '8.0'
use_frameworks!

子规格

目前有3个子规格可用:CoreMapKitWebP(这意味着你可以只安装SDWebImage的部分模块。默认情况下,你只会得到Core,所以如果你需要WebP,你需要指定它)。

Podfile 示例

pod 'SDWebImage/WebP'

Cartfile

github "rs/SDWebImage"

使用方法

Swift

如果你使用CocoaPods安装

import SDWebImage

如果你手动安装

import WebImage

Objective-C

@import WebImage;

通过克隆仓库安装

为了访问仓库中的所有文件,你应该克隆它。

git clone --recursive https://github.com/rs/SDWebImage.git

将SDWebImage项目添加到您的项目中

  • 下载页面下载并解压框架的最新版本
  • 在项目导航器上右键单击,然后选择“添加文件到 '您的项目'”
  • 在对话框中,选择 SDWebImage.framework
  • 勾选“将项目中的副本复制到目标文件夹中(如果需要)”复选框

添加依赖

  • 在您应用程序项目目标的设置中,找到“构建阶段”部分并打开“将其链接到二进制库”块
  • 再次单击"+"按钮,选择"ImageIO.framework",这是渐进式下载功能所必需的

添加链接标志

打开“构建设置”选项卡,在“链接”部分,找到“其他链接器标志”设置并添加"-ObjC"标志

Other Linker Flags

如果这导致Parse、RestKit或opencv2等扩展可选库的框架编译问题,而不是使用-ObjC标志,请使用以下替代方案:

-force_load SDWebImage.framework/Versions/Current/SDWebImage

如果你使用Cocoa Pods并且有扩展可选库的任何框架,例如Parsen RestKit或opencv2,而不是使用-ObjC标志,请使用以下替代方案:

-force_load $(TARGET_BUILD_DIR)/libPods.a

和这

$(inherited)

在源文件中导入头文件

在需要使用库的源文件中,导入头文件

#import <SDWebImage/UIImageView+WebCache.h>

构建项目

此时,您的.workspace 应该可以无错误地构建。如果您遇到任何问题,请发布到Issue,社区可以帮助您解决问题。

未来增强功能

  • LRU内存缓存清理而不是在内存警告时重置

许可

所有源代码均受MIT许可证许可。