CATiledLayer 如何知道何时提供新图块?

Posted

技术标签:

【中文标题】CATiledLayer 如何知道何时提供新图块?【英文标题】:How does CATiledLayer know when to provide a new tile? 【发布时间】:2011-11-13 16:43:16 【问题描述】:

由于种种原因,我正在考虑自己实现CATiledLayer。我做了一些调查,但我似乎无法弄清楚 CATiledLayer 如何知道要提供哪个图块。 例如,当您滚动图层时,永远不会调用 setPosition: 或 setBounds:。看起来后台线程只是在没有任何触发器的情况下突然调用了委托的 drawLayer:inContext:。 我发现 CATiledLayer 使用“CAImageProvider”的实例调用 setContent:,并且对 drawLayer:inContext: 的所有调用都来自该类。因此,这可能是确定要绘制什么图块的关键。但我找不到关于该课程的任何文档。

那么...有人知道这是如何工作的,以及我如何能够覆盖它吗?

至于CATiledLayer的缺点:

它始终使用屏幕分辨率(或 x2、x4 等);您不能将其设置为源图像的原始分辨率 您不能指定除 2 以外的任何其他比例因子 您必须指定levelsOfDetail 和levelsOfDetailBias,对此我完全看不到实现原因。如果您拥有可无限扩展的内容(例如分形),那么这是非常有限的。 最重要的是:如果您将其限制为仅在一个方向上缩放(我通过在 setTransform 中将一个方向的比例因子强制为 1 来做到这一点:),它的行为就很奇怪

【问题讨论】:

@fishiear:你的问题已经有一段时间了?我真的有同样的问题。你解决了吗?我必须完成 3 倍的缩放系数,并且还在寻找自己的解决方案。但是不知道好不好。你最后做了什么?我想与您取得联系。你可以给我写邮件。这对我来说非常重要。 @Fab1n 我没有解决这个特殊问题。我最终所做的是,每次我知道显示的内容会发生变化时(在缩放和滚动之后以及新内容可用时),都会明确地通知我的平铺层实现。我可以和你分享代码,留下你的电子邮件地址。 感谢您的快速回复。我的电子邮件地址是我 dot com 的 renneronline。哇感谢代码。认为这节省了我很多时间。 【参考方案1】:

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

【讨论】:

谢谢,但我知道。我正在寻找有关 catiledlayer 如何知道何时向我发送 drawlayer:incontext 消息的信息。

以上是关于CATiledLayer 如何知道何时提供新图块?的主要内容,如果未能解决你的问题,请参考以下文章

CATiledLayer 的背景图像

CATiledLayer:如何导致仅重新加载一些图块?

CATiledLayer 到 CALayer

如何将图块添加到谷歌地图并为其设置动画,即不断用新图块替换它们

CATiledLayer 显示以前的图块

如何保持 CALayer(CATiledLayer 的子层)在缩放后不改变其比例?