如何确定CATiledLayer已经渲染了所有可见的瓦片?

14

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

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


只是随意地敲打,无法使用drawLayer:inContext:与某些计数机制结合使用吗?因为文档表明它可以在多个后台线程中调用..类似于..在启动方法时递增计数器,然后调用其超级方法,在退出时递减计数器。如果这真的很愚蠢,也想知道为什么? :) - govi
@Joe Blow 我没有在后台执行。 - Hariprasad
不,我做了一些工作。每次调用绘制图层时,我都会触发一个方法,该方法在一定延迟后触发执行选择器(我将其保持为0.3秒,并且在我的情况下有效),在触发选择器之前,我会取消先前安排的执行选择器。假设每个瓷砖在0.3秒内调用绘制图层,最后一次调用我的回调方法将执行执行选择器。我知道这不是一个好主意,但我别无选择。 - Hariprasad
2个回答

3

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

请记住,tiling的drawrect是在后台线程上完成的。


1
实际上,CATiledLayer存在一个错误,导致它在双核环境下从不同的线程两次调用相同瓦片的drawRect方法,这会导致该方法失败。在我的测试中,使用9个瓦片的图像,在iOS 8.1中,它会调用10到16次drawRect方法。非常不可靠。 - Joel

0
这需要一些创造性思考。我曾经遇到过类似的问题,需要在瓦片图层渲染中途中止。我解决它的方式有些复杂,但似乎效果还不错。它涉及将对瓦片图层的绘制调用包装在一个NSThread中。线程有一个isFinished布尔值,您可以使用键值观察来发现瓦片图层何时完成其渲染。
如果您不熟悉iOS上的线程处理,这可能会带来更多麻烦,但它将使您知道渲染何时完成,并且还可以在必要时取消线程操作(从而取消渲染)。

你好,能否多说一些关于你是如何做到的呢?在循环过程中取消catiledlayer绘制有时确实非常方便,但我不想重复造轮子。在我的情况下,drawRect至少从两个后台线程调用。你是如何将这些调用包装在某个“外部”线程中的呢? - bor
我想支持@bor的请求,即使是在第一篇帖子发布一年后。到目前为止还没有简单明了的解决方案。你想详细说明一下吗,@lxt? - epologee
@epologee 我想一年的时间足够让我理解他的意思了... :)。准备一个函数,将包含所有绘图操作(基本上只是drawRect的内容),并通过使用NSThread间接调用该函数在drawRect中。设置k-v观察以在线程完成时收到通知。当所有报告完成时 - 销毁平铺层。这就是你做的吗,@lxt? - bor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接