前言
在用Swift寫項目時机断,發(fā)現Kingfisher中可以對網絡圖片進行縮放并添加圓角等功能线椰,感覺這個功能很實用列粪。終于SDWebImage 5.0也有了這個功能土至。今天來講一下SDWebImage的常用功能。
SDWebImage使用
先來看下面兩個方法啡浊,你會發(fā)下下面這個方法中多了一個SDWebImageContext類型的參數戳粒。實現縮放和添加圓角等功能主要就是在這個參數上。
///以前常用方法
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder
options:(SDWebImageOptions)options
///添加圓角功能使用方法
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder
options:(SDWebImageOptions)options
context:(nullable SDWebImageContext *)context
SDWebImageContext這個進去你會發(fā)現這個其實是一個NSDictionary<SDWebImageContextOption, id>類型虫啥。
SDWebImageContextOption中有一個SDWebImageContextImageTransformer為key的值蔚约。這個key對應的值必須是id<SDImageTransformer>的對象。
SDWebImage中給我們提供了幾個這種類
SDImagePipelineTransformer //它可以將多個變換器綁定在一起涂籽,讓圖像按順序逐個變換并生成最終圖像
SDImageRoundCornerTransformer //圓角
SDImageResizingTransformer //調整大小
SDImageCroppingTransformer //裁剪
SDImageFlippingTransformer //翻轉
SDImageRotationTransformer //旋轉
SDImageTintTransformer //Tint顏色
SDImageBlurTransformer //毛玻璃效果
SDImageFilterTransformer //濾鏡
需要實現調整大小并設置圓角的代碼如下
/// 圓角苹祟,這里的Radius和Size都是已像素為單位的,可以獲取手機的Scale計算出具體大小
SDImageRoundCornerTransformer *transformer1 = [SDImageRoundCornerTransformer transformerWithRadius:100 corners:UIRectCornerAllCorners borderWidth:0 borderColor:nil];
/// 大小
SDImageResizingTransformer *transformer2 = [SDImageResizingTransformer transformerWithSize:CGSizeMake(200, 200) scaleMode:(SDImageScaleModeAspectFill)];
SDImagePipelineTransformer *transformer = [SDImagePipelineTransformer transformerWithTransformers:@[transformer1, transformer2]];
[self.roundIV sd_setImageWithURL:url placeholderImage:nil options:SDWebImageRetryFailed context:@{ SDWebImageContextImageTransformer : transformer}];
另外SDWebImageOptions這個枚舉有新增评雌,有一個值我們可以用到SDWebImageAvoidDecodeImage防止解碼圖片树枫。之前版本中防止加載高清大圖導致內存暴漲一般采取的措施是如下設置(需要來回設置)。現在只需通過SDWebImageAvoidDecodeImage就可以了景东,方便很多砂轻。
[[SDImageCache sharedImageCache] setShouldDecompressImages:NO];
[[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];
SDWebImageDownloaderConfig下載配置
/// 用戶名
[SDWebImageDownloader sharedDownloader].config.username = @"httpwatch";
/// 密碼
[SDWebImageDownloader sharedDownloader].config.password = @"httpwatch01";
[[SDWebImageDownloader sharedDownloader] setValue:@"SDWebImage Demo" forHTTPHeaderField:@"AppName"];
/// 默認6個
[SDWebImageDownloader sharedDownloader].config.maxConcurrentDownloads = 6;
/// 默認15秒
[SDWebImageDownloader sharedDownloader].config.downloadTimeout = 15;
SDAnimatedImageView 加載動圖
SDWebImageCacheKeyFilter 緩存路徑過濾
有些圖片后臺返回的URL每次都不一樣(如后面的參數不同),可以根據需求將該圖片的存儲路徑進行過濾一下斤吐,可以不用每次都去下載
SDWebImageCacheKeyFilter *filter = [SDWebImageCacheKeyFilter cacheKeyFilterWithBlock:^NSString * _Nullable(NSURL * _Nonnull url) {
if (![url.absoluteString hasPrefix:@"https://ss0.bdstatic.com"]) {
return url.absoluteString;
}
// NSURLComponents *otherUrl = [[NSURLComponents alloc] init];
// otherUrl.scheme = url.scheme;
// otherUrl.host = url.host;
// otherUrl.path = url.path;
return @"https://ss0.bdstatic.com";
}];
[SDWebImageManager sharedManager].cacheKeyFilter = filter;
///正確路徑
NSString *urlString = @"https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1307986195,877877609&fm=15&gp=0.jpg";
NSURL *url = [NSURL URLWithString:urlString];
[self.roundIV sd_setImageWithURL:url completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
NSLog(@"%f", image.size.width);
}];
///不正確路徑搔涝,但匹配緩存路徑
NSString *urlString1 = @"https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy.jpg";
NSURL *url1 = [NSURL URLWithString:urlString1];
[self.normalIV sd_setImageWithURL:url1 completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
NSLog(@"%f", image.size.width);
}];
SDImageCache 緩存
/// 緩存圖片
- (void)storeImage:(nullable UIImage *)image
imageData:(nullable NSData *)imageData
forKey:(nullable NSString *)key
toDisk:(BOOL)toDisk
completion:(nullable SDWebImageNoParamsBlock)completionBlock
/// 同步清理
- (void)clearMemory;
///異步清理
- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion;
/// 同步統(tǒng)計
- (NSUInteger)totalDiskSize;
/// 異步統(tǒng)計
- (void)calculateSizeWithCompletionBlock:(nullable SDImageCacheCalculateSizeBlock)completionBlock;