【问题标题】:How do I know when a CATiledLayer has rendered all visible tiles?我如何知道 CATiledLayer 何时渲染了所有可见的图块?
【发布时间】:2011-02-22 15:18:51
【问题描述】:

我正在开发一个在 CATiledLayer 中呈现 PDF 内容的应用程序。我想在平铺层的渲染完成后触发一种方法。

是否有任何委托方法会在所有可见图块的渲染完成后立即调用?有没有其他方法可以知道何时完成?

【问题讨论】:

  • 只是随机点击,不能drawLayer:inContext: 与一些计数机制结合使用吗?正如文档所暗示的那样,它可以在多个后台线程中调用..类似于..在启动方法时增加计数器,并调用它的超级,并在退出时减少它。如果这真的很愚蠢,还会想知道为什么吗? :)
  • @Joe Blow 我不是在后台做的。
  • 你找到解决方案了吗?
  • 不,我做了一些工作。每次调用绘图层时,我都会触发一个方法,该方法会在一些延迟后触发执行选择器(我将其保持在 0.3 秒,并且在我的情况下正在工作(想法,但我别无选择。

标签: iphone ipad core-animation


【解决方案1】:

您可以在绘制之前计算绘图所需的瓷砖数量。在 tilingview 的 drawRect 中,每个 tile 只绘制一次。因此,在调用新图块的绘制矩形的一部分放置一个计数器。当您的计数器达到总数时,调用您的方法。

请记住,用于平铺的 drawrect 是在后台线程上完成的。

【讨论】:

  • 实际上 CATiledLayer 中存在一个错误,导致它在双核环境中从不同线程为同一个图块调用 drawRect 两次,从而导致此方法失败。在我对包含 9 个图块的图像的测试中,它在 iOS 8.1 中调用 drawRect 10 到 16 次。非常不可靠。
【解决方案2】:

这需要一些创造性思维。我有一个类似的问题,我需要在周期中中止平铺层的渲染。我解决它的方式有点复杂,但似乎工作得相当好。它涉及将平铺层的绘制调用包装在NSThread 中。线程有一个isFinished bool,您可以通过键值对观察来发现平铺层何时完成渲染。

如果您对 iOS 上的线程不满意,这可能比它的价值更麻烦,但会让您知道渲染何时完成,并且还可以取消线程操作(从而取消渲染) 如果需要。

【讨论】:

  • 嗨,你能多说一下你是怎么做到的吗?在循环中间取消 catiledlayer 绘图有时会非常方便,但我不想重新发明轮子。在我的情况下,至少从 2 个后台线程调用 drawRect。您是如何将这些调用封装在某个“外部”线程中的?
  • 我想支持@bor 的请求,即使是在第一次发帖一年多之后。仍然没有直接的解决方案。你想详细说明一下吗,@lxt?
  • @epologee 我认为一年的时间足以让我理解他的意思...... :)。准备一个包含所有绘图操作的函数(基本上只是drawRect的内容)并使用NSThread在drawRect中间接调用该函数。设置 k-v 观察以在线程完成时得到通知。当所有报告完成后 - 销毁平铺层。这就是你所做的@lxt?
猜你喜欢
  • 2011-11-13
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多