【问题标题】:CATiledLayer - how to use when async downloading imagesCATiledLayer - 异步下载图片时如何使用
【发布时间】:2013-01-23 19:55:27
【问题描述】:

在我的应用程序中,我有一个滚动视图,一个更大的滚动视图,上面有很多子视图,子视图会根据滚动动态添加。我尝试在滚动时动态添加子视图(图像视图),当用户滚动时,我尝试根据 pageSize 等从服务器异步获取更多图像,并将这些图像放入相应的图像视图中。..

我也参加了 Apple 的 WWDC Session 104,这似乎对离线图像很有用。

我还尝试按比例调整滚动视图上的图像大小,我相信这很好。问题是当滚动视图上的图像数量增加时,应用程序内存不足。这一定是由于我直接在图像视图中使用图像而不是使用 CATiledLayer。但是,我正在寻求使用 CATiledLayer 在滚动视图上显示异步图像的帮助。

非常感谢,

雷诺·琼斯

【问题讨论】:

    标签: iphone ios objective-c uiimageview catiledlayer


    【解决方案1】:

    我根据 cmets 完全编辑答案。

    您应该将控制器设置为滚动视图的委托,而不是在 scrollViewDidScroll: (或在 scrollViewDidEndDecelerating: 如果您想不经常检查它)方法中,您可以检查您的某些图像是否在内容视图的可见部分之外,并且然后释放(即设置指针为零)它们以节省一些内存。

    为方便起见,这里有一个示例如何获取内容的可见部分:

    CGRect visibleRect;
    visibleRect.origin = scrollView.contentOffset;
    visibleRect.size = scrollView.bounds.size;
    

    应该释放完全超出此矩形的所有内容(当然,如果用户滚动,您必须重新加载它们:不断加载/卸载可能会很棘手......)

    【讨论】:

    • 感谢您的回信,我已经在使用 GCD。但是我试图以不规则的方式显示图像,所以我不能使用 tableview。显然图像的尺寸不同,我将它们按比例缩小,宽度约为 150,高度约为 X,然后在右侧绘制另一个图像,类似于谷歌图像搜索在屏幕上显示的图像。图像被放置在另一个不规则尺寸的下方。为此,我将不得不使用 CATiledLayer。不过还是谢谢。
    • 好的,但是你必须“手动”释放看不见的图像。我猜问题出在那儿:滚动视图保留所有图像,然后消耗所有内存......
    • 感谢您的回信。那么,最好的方法是什么?我显然在滚动视图上有很多图像视图,我应该将当前不在视图中的图像视图设置为 nil 还是当用户向下滚动时。解决这个问题的最佳方法是什么?再次感谢。
    • 但是在这里,我没有进行分页,所以我也无法卸载图像。我的图像网格看起来像这样 - t0.gstatic.com/…
    • 不,谢谢。我已经这样做了,但这对我的事业没有帮助,所以我尝试使用异步图像实现 CATiledLayer,并且我已经能够做到。谢谢。
    【解决方案2】:

    简而言之,这就是我所做的一切。我已经异步下载图像并将它们缓存到设备上,然后我在当前的 tile 类中添加了一个 UIImage (imageObject) 属性,它保存正在下载的图像对象然后实施以下并为我做了诀窍。不管你信不信,imageview 加载与 CATiledLayer - CATiledLayer 的速度和效率要快 100 倍。

    + layerClass
    {
        return [CATiledLayer class];
    }
    
    - (void)drawRect:(CGRect)rect
    {
        [imgObject drawAtPoint:CGPointMake(0,0)];
    }
    

    希望它在未来对其他人有所帮助。如果我能提供更多帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      相关资源
      最近更新 更多