设置在不同网络状况下的不同图片的分类

如果需求里需要分清楚在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);

你可能感兴趣的:(设置在不同网络状况下的不同图片的分类)