有時(shí)候在設(shè)置UIImageView的大小時(shí)候需要根據(jù)UIimage的長(zhǎng)寬比來自動(dòng)設(shè)置剪芍,不讓圖片原比例失真。
如果是從本地獲取到的圖片界阁,這樣就可以拿到image了令漂,從而獲取到image的size。
[UIImage imageNamed:@""];
但大多數(shù)時(shí)候我們都是網(wǎng)絡(luò)請(qǐng)求拿到的圖片组贺,
我們需要通過NSData獲取image,但這樣來得到image凸舵,但是在網(wǎng)絡(luò)慢的情況下,這種同步的請(qǐng)求可能會(huì)讓線程卡住失尖。
NSData *data = [NSData dataWithContentsOfURL:url];
image = [UIImage imageWithData:data];
一般情況下我們都是使用SDWebImage這個(gè)第三方來加載圖片的啊奄。但都是用UIimageView來調(diào)Sd_webImage 這樣的方法直接設(shè)置渐苏,而不是拿到image后再去設(shè)置UIimageView的image,這樣我們就沒辦法先得到size設(shè)置好UIimageView的大小再去設(shè)置image增热。
查看了SDWebImage的源代碼整以,發(fā)現(xiàn)SDWebImage 中有一個(gè)獲取緩存的方法,先判斷SDWebImage有沒有緩存這個(gè)圖片峻仇,有的話就獲取公黑,沒有再使用
NSData *data = [NSData dataWithContentsOfURL:url];
image = [UIImage imageWithData:data];
來獲取.
代碼如下,
//顯示單張圖片時(shí)摄咆,固定寬度凡蚜。
__block CGFloat itemW = 200;
__block CGFloat itemH = 0;
if (_photoDataArray.count == 1) {
UIImageView * imageView = [[UIImageView alloc] init];
NSURL * url = [NSURL URLWithString:_photoDataArray.firstObject];
[imageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeHolder.jpg"]];
SDWebImageManager *manager = [SDWebImageManager sharedManager];
BOOL existBool = [manager diskImageExistsForURL:url];//判斷是否有緩存
UIImage * image;
if (existBool) {
image = [[manager imageCache] imageFromDiskCacheForKey:url.absoluteString];
}else{
NSData *data = [NSData dataWithContentsOfURL:url];
image = [UIImage imageWithData:data];
}
//根據(jù)image的比例來設(shè)置高度
if (image.size.width) {
itemH = image.size.height / image.size.width * itemW;
if (itemH >= itemW) {
itemW = 120;
itemH = image.size.height / image.size.width * itemW;
}
}