有時候在設置UIImageView的大小時候需要根據UIimage的長寬比來自動設置,不讓圖片原比例失真。
如果是從本地獲取到的圖片,[UIImage imageNamed:@""];
這樣就可以拿到image了,從而獲取到image的size。但大多數時候我們都是網絡請求拿到的圖片,
我們需要
NSData *data = [NSData dataWithContentsOfURL:url];
image = [UIImage imageWithData:data];
這樣來得到image,但是在網絡慢的情況下,這種同步的請求可能會讓線程卡住。
一般情況下我們都是使用SDWebImage這個第三方來加載圖片的。但都是用UIimageView來調Sd_webImage 這樣的方法直接設置,而不是拿到image后再去設置UIimageView的image,這樣我們就沒辦法先得到size設置好UIimageView的大小再去設置image。
在網上找到一個方法解決了這個問題,就是在SDWebImage 中有一個獲取緩存的方法,先判斷SDWebImage有沒有緩存這個圖片,有的話就獲取,沒有再使用
NSData *data = [NSData dataWithContentsOfURL:url];
image = [UIImage imageWithData:data];
來獲取
代碼如下,
//顯示單張圖片時,固定寬度。
__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];
}
//根據image的比例來設置高度
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;
}
}