【问题标题】:Get ImageView Image Original Size获取 ImageView 图片原始大小
【发布时间】:2015-05-07 19:04:29
【问题描述】:

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

[self.contentImageView setImageWithURL:thumbnail_url];

contentMode 设置为UIViewContentModeScaleAspectFill,子视图被裁剪。 这对于纵向或横向图像最有效,但UIViewContentModeScaleToFill 实际上更适合横向图像,因为横向图像要丰富得多。

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

起初,我尝试检查/记录 ImageView.image 属性,在我从 url 设置它之后直接,但它显示为 nil。 不知道为什么...?

接下来,我决定将 NSURL 放入 NSData 对象,然后从该数据创建 UIImage,并使用该 iVar 设置 ImageView 的 image 属性,如下所示:

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

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

所以,我想知道在缩放发生在contentMode 之前,是否有办法进入ImageView未裁剪 源图像属性?

【问题讨论】:

  • 您使用 AFNetworking 吗?我问是因为您将函数称为“setImageWithURL”。如果是,您是否尝试过这种方法“- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest placeholderImage:(UIImage *)placeholderImage 成功:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))成功失败:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))失败;"并在“成功”块中打印 image.size?
  • @jregnauld 是的,这个方法是 AFNetworking 的一部分 - 抱歉,刚刚注意到这个(不是我的原始代码)......会尝试这个方法......

标签: ios objective-c uiimageview uiimage


【解决方案1】:

这里的问题是您误解了第一种方法的工作原理。 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;

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

您也可以使用 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];
                                  });
               });

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

【讨论】:

  • 感谢您的回答...是的,我在我的项目中使用了这两个库 0 起初并没有意识到这个调用是 AFNetworking 库的一部分...将研究异步方法并尝试在成功块中做我需要做的事情......
  • 成功了,谢谢!应该看看超类 - 只是假设它是基本的 UIKit ......是的,经过反思,图像的(a-)同步 nil 是有道理的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2012-01-07
  • 1970-01-01
相关资源
最近更新 更多