【问题标题】:How can I make a UIScrollView with a large image that displays fast (like Photos.app)?如何使用快速显示的大图像(如 Photos.app)制作 UIScrollView?
【发布时间】:2011-01-15 17:07:51
【问题描述】:

我正在尝试制作一个简单的图像查看器来查看 ALAssetRepresentation 的全分辨率图像。事实证明,事情并没有那么简单。

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

在使用照片应用时,当您触摸图像时,较大的版本会立即打开。起初,正在绘制一个非常低分辨率的图像。但很快,出现了更高分辨率的图像。另外,如果我放大,图像首先是较低的分辨率,然后分辨率会增加。

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

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

【问题讨论】:

    标签: iphone ios uikit uiscrollview catiledlayer


    【解决方案1】:

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

    我发现高分辨率图像仅加载可能需要 1-2 秒,所以我猜在后台加载高分辨率图像可能会为您解决问题。

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

    基本思想是,您将在主线程上显示较低分辨率的版本,然后让后台线程加载全分辨率图像,然后告诉 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
            });
        });
    
    }
    

    【讨论】:

    • 实际上,fullScreenImage 并不快,因为图像是从全分辨率版本动态缩放的 :)
    • @EmilEriksson 您对此声明有参考吗?我从来没有听说过,但这是有道理的。
    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多