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