如何在页面上显示低分辨率图像,然后在第二次延迟后加载高分辨率版本?这是用图层完成的吗?主题?
我知道这篇文章很老,但万一有人正在寻找它,有一个名为NYXImagesKit的项目可以满足您的需求。
它有一个名为NYXProgressiveImageView
的类,它是UIImageView
的子类。
你所要做的就是:
NYXProgressiveImageView * imgv = [[NYXProgressiveImageView alloc] init];
imgv.frame = CGRectMake(0, 0, 320, 480);
[imgv loadImageAtURL:[NSURL URLWithString:@"http://yourimage"]];
[self.view addSubview:imgv];
[imgv release];
此外,一个很好的选择是将您的图像保存为interlaced
,以便它以低质量加载并通过下载进行改进。如果图像正常,则从上到下加载。
有几种选择:
1)以支持渐进式下载(progressive JPEG,interlaced PNG)的格式将图像保存在服务器上。我想你必须得到客户的特别支持,即。将图像解码部分从PNG / JPEG写入UIImage
自己,大概使用一些库。
2)在服务器上的每个图像上保存一个小缩略图。当您想要下载图像时,首先要下载缩略图,进行简单的缩放以将其拉伸到完整图像大小,同时下载完整版本。如果您真的想要获得幻想,可以有多种不同尺寸的缩略图。您将在服务器上有更多数据,但客户端代码应该相当简单。
3)也许你已经在客户端上有缩略图了?在这种情况下,您可以将缩略图拉伸到完整图像大小,以在加载其余图像时创建低分辨率版本。
如果你问的是如何准确编码第二个或第三个解决方案......你真的不需要显式线程,我不确定“层”在这个上下文中是什么意思。从网络加载UIImage
非常简单,有点像这样:
NSURL *url = [NSURL URLWithString:@"http://somewhere/foo.png"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:NULL error:NULL];
UIImage *image = [UIImage imageWithData:data];
您可以将此代码转换为函数,加载并显示缩略图,然后加载并显示完整图像。所有这一切都可以完成in background,以便您可以在加载数据时执行某些操作。
通常,使用某些interlaced/progessive模式保存的图像文件可以实现此功能。这允许显示应用程序(即浏览器)在第一组数据到达时以低质量连续显示图像。数据越多,图像质量越高。
此功能独立于Web服务器。只有客户端应用程序负责支持此模式
This site展示了一些例子。
这听起来像是在描述像Three20的TTPhotoViewController(用于Facebook iPhone应用程序)。当您第一次开始查看图像时,它只是一个已拉伸的缩略图。 “高分辨率”版本正在后台下载,当下载完成后,它将替换现有的拉伸图像。
我可以用afnetworking下载。我使用下面的代码
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"tempPath"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"yourUrl"]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
self.actualImage = [UIImage imageWithData:[NSData dataWithContentsOfFile:filePath]];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
[imageView setImage:[UIImage imageWithData:[NSData dataWithContentsOfFile:filePath]]];
self.actualImage = [UIImage imageWithData:[NSData dataWithContentsOfFile:filePath]];
}];
[operation start];