http://www.wugaojun.com/blog/2015/06/20/sdwebimagezhong-na-xie-hao-yong-de-fang-fa/
SDWebImage是iOS中一款处理图片的框架, 使用它提供的方法, 一句话就能让UIImageView
自动去加载并显示网络图片。特别是在UITableViewCell
中有UIImageView
需要显示来自网络的图片。SDWebImage会自动去管理这些图片, 包括缓存到内存和缓存到磁盘等等。包括gif图片的显示也是轻松完成。本文主要分享除了基本方法以外的一些其他给力方法。
图片下载
图片下载有两种方式。
以上两个方法可以下载图片,但是肯定是有差别的。相同点就不详细说了,都提供下载进度回调和下载完成回调,主要说说不同点。
- 方法1和方法2是两个不同的类,方法1(
SDWebImageDownloader
)只下载图片,不管理图片,不会缓存图片到内存和本地。方法2(SDWebImageManager
) 既下载图片,又管理图片。其实方法2内部也是调用的方法1。只不过方法2会缓存图片,并且管理下载队列。 - 下载完成之后的回调传递的参数不一样,方法1会将图片的NSData数据和传过来,而方法2只传递了image对象。
- 方法1的
completed
回调不是在主线程,如果需要在主线程做事情,得手动回到主线程。方法2的completed
回调是主线程,在做进一步处理时就不用再手动回到主线程了。
图片存储(SDImageCache类)
可以将手动将图片通过SDWebImage存储,由SDWebImage统一管理。
以上是两个比较有代表性的方法
- 方法1只能存储png或者jpg图片,不能存储gif图片,方法内部会对image对象进行转换,然后写到本地。
- 方法2就比较给力了,因为提供了
imageData
参数,可以将图片的NSData对象传过去,什么类型的图片都可以存储。这里需要注意的是,如果提供了imageData
, 那么recalculate
传递NO
就可以了, 方法内部就不会再拿UIImage对象去转换成NSData对象了了。
获取缓存图片的路径
有时候可能需要拿到缓存图片的路径做做一些事情,SDWebImage也提供了相应的方法。
获取缓存图片
调用这个方法时,SDImageCache
会先到内存中查找图片,如果没找到,再到磁盘上找。
获取缓存占用空间
这个方法会直接返回通过SDWebImage缓存的图片,在磁盘上占用的空间。
裁剪图片
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
#pragma mark - 裁剪图片
- (void)yg_setTrimImageWithUrl:(NSString *)url placeholderImage:(UIImage *)placeholder{
__weak typeof(self) ws = self;
[SDWebImageManager sharedManager].imageCache.shouldCacheImagesInMemory = NO;
[self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeholder completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (image) {
UIImage *img=[self yg_trimImageWithImage:image];
ws.image=img;
}else{
ws.image =[self yg_trimImageWithImage:placeholder];
}
}];
}
-(UIImage *)yg_trimImageWithImage:(UIImage *)image{
//imageView的宽高比
CGFloat imageViewWidthHeightRatio =self.frame.size.width/self.frame.size.height;
//屏幕分辨率
// CGFloat imageScale = [[UIScreen mainScreen] scale];
CGFloat imageScale = 1;
CGFloat imageWith = image.size.width*imageScale;
CGFloat imageHeight =image.size.height*imageScale;
//image的宽高比
CGFloat imageWidthHeightRatio =imageWith/imageHeight;
CGImageRef imageRef = nil;
CGRect rect;
// NSLog(@"\nimageWith === %f\nimageHeight === %f\nImageView宽高比 == %f\nimageScale == %f",imageWith,imageHeight,imageViewWidthHeightRatio,imageScale);
if (imageWidthHeightRatio>imageViewWidthHeightRatio) {
rect = CGRectMake((imageWith-imageHeight*imageViewWidthHeightRatio)/2, 0, imageHeight*imageViewWidthHeightRatio, imageHeight);
}else if (imageWidthHeightRatio<imageViewWidthHeightRatio) {
rect = CGRectMake(0, (imageHeight-imageWith/imageViewWidthHeightRatio)/2, imageWith, imageWith/imageViewWidthHeightRatio);
}else {
rect = CGRectMake(0, 0, imageWith, imageHeight);
}
imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
UIImage *res = [UIImage imageWithCGImage:imageRef scale:imageScale orientation:UIImageOrientationUp];
/**
一定要,千万要release,否则等着内存泄露吧,稍微高清点的图一张图就是几M内存,很快App就挂了
*/
CGImageRelease(imageRef);
return res;
}
其他给力方法
Done!