如果需求里需要分清楚在wifi環(huán)境還是3G/4G網(wǎng)絡(luò)狀況下的圖片加載的話,可以采用這個分類方法,快速加載自己想用的圖片
需要的框架
1.SDWebImage
2.AFNetWorking
.h文件
(由于不能打小括號所以就看一下要導入的框架即可)
#import UIKIT
#import UIImageView+WebCache.h
@interface UIImageView (Download)
/**
設(shè)置在不同網(wǎng)絡(luò)狀況下的不同圖片
注意:測試網(wǎng)絡(luò)環(huán)境的代碼一定要在一進入程序的位置AppDelegate那里進行加載
//開始監(jiān)控網(wǎng)絡(luò)狀況 -- 一開始就調(diào)用去檢測網(wǎng)絡(luò)狀況
[[AFNetworkReachabilityManager sharedManager]startMonitoring];
@param originImageURL? ? WIFI網(wǎng)絡(luò)下用大圖
@param thumbnailImageURL 3G/4G網(wǎng)絡(luò)下用縮略圖
@param placeholder? ? ? 占位圖片
@param completeBlock? ? 設(shè)置成功后的回調(diào)
*/
-(void)xmg_setOriginImage:(NSString *)originImageURL thumbnailImage:(NSString *)thumbnailImageURL placeholder:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completeBlock;
@end
.m文件
import AFNetworkReachabilityManager.h
@implementation UIImageView (Download)
-(void)xmg_setOriginImage:(NSString *)originImageURL thumbnailImage:(NSString *)thumbnailImageURL placeholder:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completeBlock
{
//根據(jù)網(wǎng)絡(luò)狀況來加載圖片
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
#warning imageFromDiskCacheForKey只取不下載,sd_setImageWithURL先下載,又取
//從沙盒中查看是否有大圖 - 這個方法做的不錯,他會先去內(nèi)存中查看有沒有指定圖片,然后再做策略(SDWebImage的圖片緩存是用圖片的url字符串作為key)
//url字符串 -> 對應一個uiimage ->即獲取原圖
UIImage *originalImage = [[SDImageCache sharedImageCache]imageFromDiskCacheForKey:originImageURL];
if (originalImage) {//原圖已經(jīng)被下載過
self.image = originalImage;
//要傳遞一個block進去
completeBlock(originalImage,nil,0,[NSURL URLWithString:originImageURL]);
}else{//原圖沒有被下載過
if (mgr.isReachableViaWiFi) {//wifi加載
[self sd_setImageWithURL:[NSURL URLWithString:originImageURL]placeholderImage:placeholder completed:completeBlock];
}else if(mgr.isReachableViaWWAN){//手機自帶的網(wǎng)絡(luò)加載
//如果添加需求,3G/4G網(wǎng)絡(luò)也下載大圖打勾的話,在這里做進一步判斷,if(3g\4g網(wǎng)絡(luò)也下載大圖){xxxx//下載大圖代碼}
#warning downloadOriginImageWhen3GOR4G的值需要從沙盒里去獲取
//定義3G/4G網(wǎng)絡(luò)下是否要下載原圖
BOOL downloadOriginImageWhen3Gor4G = YES;
if (downloadOriginImageWhen3Gor4G) {
[self sd_setImageWithURL:[NSURL URLWithString:originImageURL]placeholderImage:placeholder completed:completeBlock];
}else{
[self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL]placeholderImage:placeholder completed:completeBlock];
}
}else{//沒有可用網(wǎng)絡(luò)
UIImage *thumbnailImage = [[SDImageCache sharedImageCache]imageFromDiskCacheForKey:thumbnailImageURL];
if (thumbnailImage) {//縮略圖已經(jīng)被下載過
self.image = thumbnailImage;
//要傳遞一個block進去
completeBlock(thumbnailImage,nil,0,[NSURL URLWithString:thumbnailImageURL]);
}else{//沒有下載過任何圖片
//占位圖片 由于沒有所以nil
self.image = placeholder;
}
}
}
}
@end
如何調(diào)用?
//根據(jù)網(wǎng)絡(luò)狀況來加載圖片 占位圖imageBackground -- 如果要下載完畢之后,讓占位圖片隱藏這個過程的話,需要在后面加一句block,讓placeholder隱藏起來
[self.imageView xmg_setOriginImage:topic.image1 thumbnailImage:topic.image0 placeholder:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
//如果image沒有值,沒有必要做事了
if (!image) return ;
//讓占位圖片隱藏
self.placeHolderImage.hidden = YES;
//處理超長圖片 -- 用上下文處理,來處理經(jīng)過裁剪之后的不和諧
if (topic.isBigPicture) {
//獲取需要裁剪的圖片寬高
CGFloat imageW = topic.middleFrame.size.width;
CGFloat imageH = imageW * topic.height / topic.width;
CGSize size = CGSizeMake(imageW,imageH);
//開啟上下文
UIGraphicsBeginImageContext(size);
//繪制圖片到上下文中 -> 用這個方法,框有多大就畫在框里
[self.imageView.image drawInRect:CGRectMake(0, 0, imageW, imageH)];
//獲得當前上下文的image,然后當前imageview替換之
self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
//關(guān)閉上下文
UIGraphicsEndImageContext();
}
}];
按鈕控制注意
//控制按鈕子控件對齊,不是用contentMode,是用以下兩個屬性
//UIButton *btn;
?btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
btn.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
//這個分別是設(shè)置按鈕的內(nèi)部子控件之間的邊距,文字內(nèi)邊距和圖片內(nèi)邊距,xib設(shè)置這些參數(shù)的話,在尺子圖標里(xcode8)
btn.contentEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);
btn.titleEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);
btn.imageEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);