【问题标题】:Preloading a large image预加载大图像
【发布时间】:2012-02-27 03:53:28
【问题描述】:

我有一张尺寸为 5534 × 3803,大小为 2.4mb 的图像。 UIView 参考说明:

"在 iOS 3.0 及更高版本中,视图不再限制在此最大值 大小,但仍然受到它们消耗的内存量的限制。”

当图像加载时,它会延迟半秒,然后滑入。图像位于 1024x704 的 UIImageView 中,但为了我的应用程序的目的,可以放大到该大小的 4 倍。

您能否在 AppDelegate 中预加载图像?或者有没有其他方法可以解决如此大的图像?

谢谢

编辑:缩放是通过 UIPinchGestureRecognizer 完成的,并根据图像的中心点放大并完成(缩放 x4 - x1)。放大时没有平移图像。

【问题讨论】:

标签: iphone objective-c uiimageview


【解决方案1】:

就我个人而言,我会尝试编写一个基于图块的系统(想想 Google 地图),将您的大图像分割成小图像网格,以避免将巨大的图像一次全部加载到 RAM 中。我真的不知道您对这张图片的用户交互是什么,或者图片是否正在改变或融入您的项目,但我假设您可以让用户滚动,因为该图片比任何 iOS 屏幕都大。使用基于图块的系统,您只加载屏幕上的图像。 CATiledLayer 是一个用于做这种事情的 Apple 类。这可能就是您想要研究的内容。

请参阅this StackOverflow question 了解一些不同的方法。接受的答案使用来自 Apple 示例 PhotoScroller 项目的代码,该代码可能满足您的需求并使用 CATiledLayer。

这个ScrollViewSuite Apple 代码也可能会在您的路上使用(查看 Tiling 代码)。

【讨论】:

  • 即使我不平移,这种方法是否仍然可行?我只是有一个开始缩小的大图像,以便在屏幕范围内看到整个图像,但可以放大到它的实际大小(大约 4 倍缩放)。
  • 如果您不希望用户能够滚动浏览全尺寸版本,那么您可以将四种不同尺寸的图像保存到磁盘,使用“全尺寸”版本被保存到您希望用户查看适合 iPad/iPhone 屏幕区域的区域。这不太灵活,但可以解决内存问题。
  • 我建议您查看我链接的 PhotoScroller 项目——我相信它类似于 Apple 使用他们的照片应用程序所做的。无论源图像有多大,他们的照片加载速度都很快。
  • PhotoScroller 似乎可以完成这项工作。所有这些平铺图像不会创建一个相当大的应用程序吗?
  • 没有。如果您查看 ImageScrollView.m 中的 displayTiledImageNamed 方法,您会看到它为 TilingView.m 文件中的 CATiledLayer 类提供了大小参数,然后它会执行一些平铺魔术。您会看到 TilingView 实际上并没有将每个图块保存到磁盘。相反,tileForScale 方法被赋予一个 col/row 并抓取图像的该部分并动态返回它。
猜你喜欢
  • 2011-06-15
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2015-08-12
  • 2018-12-22
相关资源
最近更新 更多