【问题标题】:Keeping an image in view after removed from superview从超级视图中删除后保持图像在视图中
【发布时间】:2012-08-26 04:07:02
【问题描述】:

我从 Apple 的 PhotoScroller 示例代码中提取了一些代码以使用 CATiledLayer。我有一张从互联网上加载的 8000x7000px 的图片,在图块中。

这是我的应用程序中的一种地图功能。我还有两张几乎相同的图像,具有不同的叠加层(尝试仅添加叠加层而没有运气)。

我有一个UISegmentedControl 在三个选项之间切换,我希望 imageView 从所选图像加载图像。因此,如果用户放大其中一个图像并选择另一个选项,则比例和坐标保持不变,并且 imageView 将所选图像加载到必要的平铺点中。

我已经部分解决了这个问题。或者,我实际上已经解决了这个问题,但是当我选择另一个选项时,调用函数[imageView removeFromSuperview]; 时整个屏幕变黑。在几秒钟内变黑后(取决于互联网速度),它会显示正确的图块。

如果可能,我希望图层“淡入”到下一层。您可能知道,当使用CATiledLayer 时,第一层是低分辨率的整个图像,但是当放大时,必要的图块会“淡入”到具有较小图块的下一层。

我基本上需要给(TilingView*)imageView 一个“重新加载”命令,并希望它“淡出”最后一张图像。

我试图注释掉[imageView removeFromSuperview];,这实际上让我接近了我想要的。当我放大并选择另一个选项时,新图像实际上淡化了旧图像,但是,当我缩小时,旧图像明显停留在背景中(在新图像后面),没有任何反应。稍后我需要将其从 superView 中删除,但我无法再访问它,因为新图像已取代了 imageView 的位置。我知道人们可能想在这里查看代码,但我真的不知道要显示什么代码。而且CATiledLayer 的记录很差,我真的很难理解发生了什么。

【问题讨论】:

  • 如果您从 inet 加载完整的切片而不是 jpeg,这似乎需要更多时间。您可能想查看 PhotoScrollerNetwork(在 github 上) - 它可以让您下载 jpeg,它会为您平铺它们,并允许并发下载。您也可以将它与 Quartz only 或 libjpegturbo 一起使用。
  • @DavidH 是的,我已经检查过了,但这不会花更多时间吗?我想必须下载整个图像才能让 imageview 显示任何内容?而不仅仅是所需的瓷砖?由于这是一个地图功能,用户可能永远不会查看所有图像的整个深度层,因此不需要下载整个图像..
  • 如果您可以先下载第一个小视图的图块,那么您是正确的,这在时间上是一个巨大的胜利。
  • 其实你刚刚给了我一个关于如何加速 PSN 的好主意——使用渐进式 jpeg。这将允许小图像快速出现。而不是从大到小做相反的事情!谢谢!

标签: iphone objective-c ios cocoa-touch catiledlayer


【解决方案1】:

我通过一些粗略的代码使它工作。可能还有其他更好的解决方案,但这是我目前知道的唯一一个。

问题是当我删除[imageView removeFromSuperview]; 时,它并没有卸载最后一张图片,因此让它永远留在内存中。由于它不受缩放和滚动的影响,所以当我缩小时,它总是在后台。如果我要在选项之间切换多次,就会在后台添加多张图片。

我只是创建了一个“helper”,正如我所说的那样。一个新的imageView,它在切换选项时获取旧imageView 的内容,而不是将其从超级视图中删除,因为当新图像尚未完全加载时,过早删除会导致黑屏。

我现在在委托方法scrollViewWillBeginZoomingscrollViewWillBeginDragging 中调用[helper removeFromSuperview];。这导致在单击另一个选项和用户滚动或缩放之间的时间内,内存最多包含两个图像。

注意:如果用户在UISegmentedControl中切换选项后立即滚动或缩放,它会变成黑色,因为尚未加载新图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多