我有一个TableViewCell
ImageView
,我正在设置图像:
[self.contentImageView setImageWithURL:thumbnail_url];
contentMode
设置为UIViewContentModeScaleAspectFill
,子视图会被剪裁。
这对于纵向或横向的图像效果最佳,但UIViewContentModeScaleToFill
实际上更适用于更丰富的横向图像。
所以,我想通过比较宽度和高度来检测图像的方向,并相应地更改contentMode
。
首先,我尝试在从网址设置后直接检查/记录ImageView.image
属性,但显示为零。 不确定为什么......
接下来,我决定将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
的加载速度,所以我想避免它。
所以,我想知道在ImageView
缩放发生之前是否还要进入contentMode
的未裁剪的源图像属性?< / p>
答案 0 :(得分:2)
这里的问题是你对第一种方法如何运作的误解。 setImageWithURL:
是来自其中一个开源图像加载库的方法。可能是AFNetworking或SDWebImage。
这些方法是异步的并立即返回。他们在后台队列上下载图像,然后返回主队列以使用它设置视图。您正在尝试在下载之前访问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];
});
});
这是网络中用于在更新主队列上的视图之前在后台队列上执行网络请求和处理的基本模式。请记住,这段特殊的代码非常简单,需要更多的工作才能像我上面提到的库那样工作。