当使用像SDWebImage或UIImageView+AFNetworking这样的异步加载库时,我如何在UIImage



SDWebImage和AFNetworking等库添加了基于异步加载的URL在UIImageView上设置image的功能,因此在加载图像时不会让用户等待。

为了我的使用,我正在创建一个类似于Photos.app的图库,但图像是从URL加载的。如果图库中有50张高分辨率图像,我不希望用户在查看第一张之前必须等待每一张都加载,所以这些库非常适合我的用例(我会加载第一张图像,然后按需加载)。

然而,当图像的帧还不知道时,我很困惑如何在视图中显示图像,因为图像还没有下载。如果每个人都有相同的帧(例如,如果他们是化身),这将不是问题,但事实并非如此。

在我的情况下,我使用UIImageViews如下:

// Create image view
self.imageView = [[UIImageView alloc] initWithImage:image];
self.imageView.userInteractionEnabled = YES;
// Create scroll view
self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
self.scrollView.delegate = self;
self.scrollView.contentSize = self.imageView.bounds.size;
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
self.scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
// Figure out the zoom extremities, as well as the initial zoom level so full image is visible
CGFloat scrollViewWidthRatio = CGRectGetWidth(self.scrollView.bounds) / self.scrollView.contentSize.width;
CGFloat scrollViewHeightRatio = CGRectGetHeight(self.scrollView.bounds) / self.scrollView.contentSize.height;
CGFloat minScale = MIN(scrollViewWidthRatio, scrollViewHeightRatio);
self.scrollView.minimumZoomScale = minScale;
self.scrollView.zoomScale = minScale;
self.scrollView.maximumZoomScale = 1.0;
// Add image view and scroll view
[self.scrollView addSubview:self.imageView];
[self.view addSubview:self.scrollView];

然而,当图像异步加载时,这一切似乎都会中断。当图像可以是一百万种不同大小中的任何一种时,我应该将帧设置为什么?由于同样的问题,我应该将scrollView.contentSize设置为什么?如何计算滚动视图的缩放比例?

基本上,当我还不知道框架或尺寸的概念时,我该如何使用它?加载图像时,有没有办法刷新所有这些?

重新滚动查看所有子视图会花费很多钱。您想要的效果必须取决于服务器中的数据,您可以在下载之前从中获取图片大小。有许多样式,主要有两种方法:

  1. 处理Url:http://xxx.xx.xx.pic_200*150200*150为图片大小
  2. 服务器返回添加大小数据。{@"宽":200,@"高":150}

使用该大小,您可以使用默认图像布局scrollView,然后异步加载,并在下载完成时更新图像。

希望能帮助你!

最新更新