Ios 获取ImageView图像原始大小

Ios 获取ImageView图像原始大小,ios,objective-c,uiimageview,uiimage,Ios,Objective C,Uiimageview,Uiimage,我有一个TableViewCell和一个ImageView,我正在这样设置图像: [self.contentImageView setImageWithURL:thumbnail_url]; contentMode设置为UIViewContentModeScaleAspectFill,子视图被剪裁。 这对于纵向或横向图像最为有效,但是UIViewContentModeScaleToFill实际上对于横向图像效果更好,因为横向图像更丰富 因此,我想通过比较宽度和高度来检测图像的方向,并相应地更改

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

[self.contentImageView setImageWithURL:thumbnail_url];
contentMode
设置为
UIViewContentModeScaleAspectFill
,子视图被剪裁。 这对于纵向或横向图像最为有效,但是
UIViewContentModeScaleToFill
实际上对于横向图像效果更好,因为横向图像更丰富

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

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

接下来,我决定将该
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的
的加载速度,因此我希望避免这种情况


因此,我想知道在对
contentMode

进行缩放之前,是否有必要研究
ImageView的未裁剪源图像属性。这里的问题是您对第一种方法的工作原理有误解
setImageWithURL:
是一个来自开源图像加载库的方法。可能是或

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

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

对于AFN网络,您可以使用以下方法:

- (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;
- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock;
对于SDWebImage,您可以使用以下方法:

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

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

您使用AFNetworking吗?我这样问是因为您调用了函数“setImageWithURL”。如果是,您是否尝试了此方法“-(void)setImageWithURLRequest:(NSURLRequest*)urlRequest占位符图像:(UIImage*)占位符图像成功:(void(^)(NSURLRequest*请求,NSHTTPURLResponse*响应,UIImage*图像))成功:(void(^)(NSURLRequest*request,NSHTTPURLResponse*response,NSError*error)失败),并在“成功”块中打印image.size?@jregnauld是的,此方法是AFNetworking的一部分-抱歉,刚刚注意到这一点(不是我的原始代码)…将尝试该方法…感谢您的回答…是的,我正在使用我的项目中的这两个库0起初没有意识到此调用是AFNetworking库的一部分…将研究异步方法,并尝试在成功块中执行我需要执行的操作…成功了,谢谢!应该查看超类-只是假设它是基本的UIKit…是的,经过反射,(a-)图像的同步nil是有意义的。。。