获取 ImageView 图片原始大小

Get ImageView Image Original Size

我有一个 TableViewCell 和一个 ImageView,我正在这样设置图像:

[self.contentImageView setImageWithURL:thumbnail_url];

contentMode设置为UIViewContentModeScaleAspectFill,子视图被裁剪。 这最适合肖像或风景图像,但 UIViewContentModeScaleToFill 实际上更适合风景图像,因为风景图像数量更多。

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

起初,我尝试inspect/log ImageView.image 属性,直接从url设置后,但显示为nil。 不确定为什么...?

接下来,我决定将 NSURL 放入一个 NSData 对象中,然后根据该数据创建一个 UIImage,并设置 ImageView 的图像 属性 用那个 iVar,像这样:

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

这 - 特别是 NSData 调用 - 大大减慢了 TableViewCell's 的加载速度,所以我想避免它。

所以,我想知道在缩放发生在 contentMode?

这里的问题是您对第一种方法的工作原理有误解。 setImageWithURL: 是来自开源图像加载库之一的方法。可能 AFNetworking or SDWebImage.

这些方法是异步的,return 是立即执行的。他们将图像下载到后台队列,然后 return 到主队列以设置视图。您正试图在 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;

在其中任何一个中,回调块都会让您在下载图像后访问图像(如果成功)。

您也可以使用 dataWithContentsOfURL: 方法通过 GCD 手动完成类似的工作:

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];
                                  });
               });

这是网络中使用的一种基本模式,用于在更新主队列上的视图之前在后台队列上执行网络请求和处理。请记住,这段特定的代码非常简单,需要更多的工作才能像我上面提到的库一样好地工作。