CATiledLayer如何知道何时提供新的瓦片?

4
因为各种原因,我考虑制作自己的CATiledLayer实现。我做了一些调查,但似乎无法弄清楚CATiledLayer如何知道提供哪个瓷砖。
例如,当您滚动图层时,永远不会调用setPosition:或setBounds:。看起来后台线程只是在没有任何触发器的情况下随意调用委托的drawLayer:inContext:。
我已经发现CATiledLayer使用“CAImageProvider”的实例调用setContent:并且所有对drawLayer:inContext:的调用都源自该类。所以,这可能是确定要绘制哪个瓷砖的关键。但我找不到有关该类的任何文档。
那么...有人知道这是如何工作的,以及我如何覆盖它吗?
至于CATiledLayer的缺点:
- 它总是使用屏幕分辨率(或x2、x4等);您无法将其设置为源图像的本机分辨率 - 您无法指定除2以外的任何其他缩放因子 - 您必须指定levelsOfDetail和levelsOfDetailBias,对此我完全没有实现原因。如果您具有可以无限缩放的内容,例如分形,则这非常限制。 - 最重要的是:如果您将其限制为仅在一个方向上缩放(我通过在setTransform:中强制一方向的比例因子为1来实现),它会表现出所有奇怪的行为。

@fishiear:你的问题已经有一段时间了吗?我确实也遇到了同样的问题。你解决了吗?我需要完成3倍缩放因子,也在寻找自己的解决方案。但我不知道它是否好用。你最终做了什么?我想与你联系。你可以给我写封邮件。这对我非常重要。 - Fab1n
@Fab1n 我没有解决这个特定的问题。最终我做的是,在每次我知道显示内容会改变的时候(缩放和滚动后以及有新内容可用时),明确地通知我的平铺图层实现。我可以与您分享代码,请留下您的电子邮件地址。 - fishinear
感谢您的快速回复。我的电子邮件地址是renneronline at me dot com。哇,非常感谢您提供的代码。我认为这可以节省我很多时间。 - Fab1n
1个回答

1
drawLayer:inContext:中,您可以使用CGContextGetClipBoundingBox获取边界框。 CGContextGetCTM应该为您提供有关当前分辨率的信息。

谢谢,但我知道。我正在寻找关于Catiledlayer何时向我发送drawlayer:incontext消息的信息。 - fishinear

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