如何使用快速显示的大图像(如Photos.app)制作UIScrollView?

时间:2011-01-15 17:07:51

标签: iphone ios uikit uiscrollview catiledlayer

我正在尝试制作一个简单的图像查看器,用于查看ALAssetRepresentation的全分辨率图像。事实证明它并不那么简单。

我的第一个方法是在UIScrollView中创建一个大的UIImageView。虽然这确实有效,但速度很慢。

使用“照片”应用时,触摸图像时会立即打开较大的版本。首先,绘制的图像分辨率非常低。但很快,出现了更高分辨率的图像。此外,如果我放大,图像的分辨率会先降低,然后分辨率会增加。

我查看了WWDC 2010主题演讲#104,其中描述了Photos.app的工作原理。但我该如何实现呢?在主题演讲中,该演示使用了预先平铺的图像,这是我无法从ALAssetRepresentation中获得的。我试过加载全分辨率版本并只使用CATiledLayer绘制它,虽然缩放et.c并不慢,但绘制瓷砖时速度太慢。

Photos.app是否在某处或所发生的事情中缓存所有图像的较低分辨率版本?关于做什么的一些指示会有所帮助。

1 个答案:

答案 0 :(得分:0)

是的,Photos.app正在缓存较低分辨率的图像。好消息是你也可以获得那些缓存版本。您可能已经知道ALAssetRepresentation的fullScreenImage属性和ALAsset的缩略图属性。这些应该更快加载。

我在高分辨率图像中发现的是,加载它可能需要1-2秒,所以我猜测只是在背景中加载高分辨率图像可能会对你有所帮助。 / p>

那么,如何加载图像的低分辨率版本,然后当你有i时切换到高分辨率版本。它可能有点复杂,但希望这可以让你开始。由于您正在使用AssetsLibrary,因此您将不得不使用iOS 4,这是个好消息,因为您可以使用块和GCD / libdispatch轻松完成此操作。我很高兴你正在观看WWDC视频 - 查看有关GCD的大量信息的会议206和211。

基本思想是你要在主线程上显示较低分辨率版本,然后要求后台线程加载全分辨率图像,然后告诉CATiledLayer切换到全分辨率图像。

- (void)displayAsset:(ALAssetRepresentation *)asset {
  UIImage *lowresImage = [UIImage imageWithCGImage:asset.fullScreenImage
                               orientation:asset.orientation scale:asset.scale];
  // Add code here to display the lowresImage

  dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
    ^ {
      // Load the full resolution image from the asset
      UIImage *highresImage = [UIImage imageWithCGImage:asset.fullResolutionImage
                                   orientation:asset.orientation
                                   scale:asset.scale];

      // Once done, tell the main thread to display the tiles
      dispatch_async( dispatch_get_main_queue(),
        ^ {
          // Code to swap out the lowresImage for highresImage
        });
    });

}