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是有意义的。。。