2015-05-07 203 views
1

我有一个ImageView一个TableViewCell,和我设置的图像,像这样:获得ImageView的原始图象尺寸

[self.contentImageView setImageWithURL:thumbnail_url]; 

contentMode设置为UIViewContentModeScaleAspectFill,和子视图被裁剪。 这对于纵向或横向的图像效果最佳,但UIViewContentModeScaleToFill实际上对横向图像效果更佳,而这种效果更为丰富。

因此,我想通过比较宽度和高度来检测图像的方向,并相应地更改contentMode

起初,我试图检查/登录ImageView.image属性,直接从url设置后,但它显示为零。 不确定为什么......?

接下来,我决定把该NSURLNSData对象,然后创建从数据UIImage,并与伊娃设置ImageView的形象财产,像这样:

NSData *data = [NSData dataWithContentsOfURL:thumbnail_url]; 
UIImage *image = [UIImage imageWithData:data]; 
[self.contentImageView setImage:image]; 
// Get image.size etc. 

这 - 特别是NSData的呼叫 - 大大减缓了TableViewCell's的负载,所以我想避免它。

所以,我想知道是否有无论如何要走向ImageView未裁剪源图像属性中的比例发生了contentMode过吗?

+1

你使用AFNetworking吗?我问,因为你调用函数“setImageWithURL”。 (无效)setImageWithURLRequest:(NSURLRequest *)urlRequest placeholderImage:(UIImage *)placeholderImage success:(void(^)(NSURLRequest * request,NSHTTPURLResponse * response,UIImage * image) )成功 失败:(void(^)(NSURLRequest * request,NSHTTPURLResponse * response,NSError * error))failure;“并在“成功”块中打印image.size? – jregnauld

+0

@jregnauld是的,这种方法是AFNetworking的一部分 - 对不起,刚注意到这个(不是我原来的代码)...会试试这个方法... –

回答

2

这里的问题是您对第一种方法如何工作的误解。 setImageWithURL:是来自其中一个开源图像加载库的方法。可能是AFNetworkingSDWebImage

这些方法是异步的,并立即返回。他们将图像下载到后台队列中,然后返回主队列以使用该队列设置视图。在下载之前,您正尝试访问image。手册NSData方法工作的原因是因为它是同步的,主队列在图像下载时卡住。

我提到的两个库都有独立的方法,在主队列上有一个回调块,允许您对响应进行操作。

对于AFNetworking您可以使用此方法:

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 
       placeholderImage:(UIImage *)placeholderImage 
         success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success 
         failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; 

对于SDWebImage您可以使用此方法:

- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; 

在这两种,回调块会让你访问图像,一旦被下载(如果成功)。

您也可以通过使用GCD这样做是这样的工作中使用的dataWithContentsOfURL:方法手动:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() 
       { 
        NSData *data = [NSData dataWithContentsOfURL:thumbnail_url]; 
        UIImage *image = [UIImage imageWithData:data]; 
        dispatch_async(dispatch_get_main_queue(), ^() 
            { 
             [self.contentImageView setImage:image]; 
            }); 
       }); 

这是在联网之前执行的背景队列网络请求并处理时使用的基本模式更新主队列上的视图。请记住,这段代码非常简单,需要更多的工作才能像上面提到的库一样工作。

+0

感谢您的回答...是的,我正在使用这两个我的项目中的库0并没有意识到这个调用是最初的AFNetworking库的一部分...将研究异步方法,并尝试做我需要做的成功块... –

+0

做到了这一点, 谢谢!应该看看超类 - 只是认为它是基本的UIKit ...是的,经过反思,图像的(a-)同步零是有意义的... –

相关问题