如果需求里需要分清楚在wifi环境还是3G/4G网络状况下的图片加载的话,可以采用这个分类方法,快速加载自己想用的图片
需要的框架
1.SDWebImage
2.AFNetWorking
.h文件
(由于不能打小括号所以就看一下要导入的框架即可)
#import UIKIT
#import UIImageView+WebCache.h
@interface UIImageView (Download)
/**
设置在不同网络状况下的不同图片
注意:测试网络环境的代码一定要在一进入程序的位置AppDelegate那里进行加载
//开始监控网络状况 -- 一开始就调用去检测网络状况
[[AFNetworkReachabilityManager sharedManager]startMonitoring];
@param originImageURL WIFI网络下用大图
@param thumbnailImageURL 3G/4G网络下用缩略图
@param placeholder 占位图片
@param completeBlock 设置成功后的回调
*/
-(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
{
//根据网络状况来加载图片
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
#warning imageFromDiskCacheForKey只取不下载,sd_setImageWithURL先下载,又取
//从沙盒中查看是否有大图 - 这个方法做的不错,他会先去内存中查看有没有指定图片,然后再做策略(SDWebImage的图片缓存是用图片的url字符串作为key)
//url字符串 -> 对应一个uiimage ->即获取原图
UIImage *originalImage = [[SDImageCache sharedImageCache]imageFromDiskCacheForKey:originImageURL];
if (originalImage) {//原图已经被下载过
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){//手机自带的网络加载
//如果添加需求,3G/4G网络也下载大图打勾的话,在这里做进一步判断,if(3g\4g网络也下载大图){xxxx//下载大图代码}
#warning downloadOriginImageWhen3GOR4G的值需要从沙盒里去获取
//定义3G/4G网络下是否要下载原图
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{//没有可用网络
UIImage *thumbnailImage = [[SDImageCache sharedImageCache]imageFromDiskCacheForKey:thumbnailImageURL];
if (thumbnailImage) {//缩略图已经被下载过
self.image = thumbnailImage;
//要传递一个block进去
completeBlock(thumbnailImage,nil,0,[NSURL URLWithString:thumbnailImageURL]);
}else{//没有下载过任何图片
//占位图片 由于没有所以nil
self.image = placeholder;
}
}
}
}
@end
如何调用?
//根据网络状况来加载图片 占位图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;
//处理超长图片 -- 用上下文处理,来处理经过裁剪之后的不和谐
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();
//关闭上下文
UIGraphicsEndImageContext();
}
}];
按钮控制注意
//控制按钮子控件对齐,不是用contentMode,是用以下两个属性
//UIButton *btn;
btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
btn.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
//这个分别是设置按钮的内部子控件之间的边距,文字内边距和图片内边距,xib设置这些参数的话,在尺子图标里(xcode8)
btn.contentEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);
btn.titleEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);
btn.imageEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);