13

全部,

我无法从 CATiledLayer 获得我想要的行为。有没有一种方法可以触发瓷砖重绘,而不会产生首先将它们的区域清除为白色的副作用?我已经将 CATiledLayer 子类化为将 fadeDuration 设置为返回 0。

更具体地说,以下是我所看到的以及我正在努力实现的目标的详细信息:

  • 我有一个内容大小很大的 UIScrollView...~12000x800。它的内容视图是一个由 CATiledLayer 支持的 UIView。
  • UIView 使用大量自定义绘制的线条呈现
  • 一切正常,但 UIView 的内容有时会发生变化。发生这种情况时,我想尽可能无缝地重绘瓷砖。当我在视图上使用 setNeedsDisplay 时,图块会重新绘制,但它们首先会被清除为白色,并且在绘制新内容之前会有几分之一秒的延迟。我已经对 CATiledLayer 进行了子类化,以便将 fadeDuration 设置为 0。
  • 我想要的行为似乎应该是可能的......当您放大滚动视图并且内容以更高分辨率重绘时,重绘之前没有空白;新内容绘制在旧内容之上。这就是我要找的。

谢谢; 我很欣赏你的想法。

更新

只是跟进 - 我意识到在重绘之前瓷砖没有被清除为白色,它们被完全取出;我看到的白色是我的 CATiledLayer 支持的视图下方的视图颜色。

作为快速破解/修复,我在 UIScrollView 下方放置了一个 UIImageView,在触发 CATiledLayer 支持的视图的重绘之前,我将其可见部分渲染到 UIImageView 中并让它显示。这大大平滑了重绘。

如果有人有更好的解决方案,比如在重绘之前防止重绘目标瓷砖消失,我仍然很想听听。

4

5 回答 5

4

我发现如果您将levelsOfDetailBias 和levelsOfDetail 都设置为相同的值(在我的情况下为2),那么它只会重绘我的setNeedsDisplayInRect: 调用所触及的图块,正如您所希望的那样。

但是,如果levelsOfDetail 与LODB 不同,那么任何对setNeedsDisplayInRect: 的调用都会重绘所有图块。

于 2013-03-28T00:45:45.330 回答
1

另一种可能的选择是使用相同的委托将内容绘制到位图上下文,并在内容刷新后将位图交换到后备存储中。这应该会产生无闪烁的结果。话虽如此,我无法告诉您这是如何完成的,而 CATiledLayers 的一个好处是它们会在您缩放时自动生成图块,并在您平移放大后预生成图块。

我想看看您如何实现您的应用程序。我一直在寻找几个星期来找到一个结合使用 UIScrollView 和 CATiledLayer-back 视图以及许多自定义绘制线的示例。Apple 有一些很棒的示例代码 - 但它都涉及图像而不是线条艺术,所以对我没有帮助。

于 2010-05-19T00:23:50.897 回答
1

您可以在现有的平铺层后面添加另一个层(可能是 CATiledLayer)。(一种双缓冲解决方案。)您可以setNeedsDisplay:从几秒钟后触发的计时器调用第二层,以确保该层不会与前层同时重绘。

于 2010-01-16T16:34:17.417 回答
0

我在 iPad 上遇到了同样的问题。

该解决方案比我想象的要简单,也比在重绘之前使用 UIImageView 渲染显示要简单得多...:

只是不要为图层设置任何背景颜色!

我以类似的方式设置了 CATiledLayer:

layer = [[CATiledLayer alloc] init];
layer.masksToBounds = YES;
layer.contentsGravity = kCAGravityLeft;

//layer.backgroundColor = [[UIColor whiteColor] CGColor];

layer.tileSize = CGSizeMake(1004.0, 1004.0);
layer.levelsOfDetail = 16;
layer.levelsOfDetailBias = 8;

请注意,我已将线条设置图层的背景颜色注释为白色。之后,重绘问题之前的白色空白消失了!

让我知道是否有人尝试过。

于 2010-07-01T15:45:30.483 回答
0

在没有解决方案的情况下阅读了这些答案后,我发现平铺页面是主要的后台任务。
在高优先级队列上准备我的 lo-res 占位符图像解决了这个问题 - 图像现在在平铺发生时出现。缓存占位符图像进一步改善了它们的外观 - 它们出现在平铺开始之前。
使用较新的设备,平铺速度如此之快,这些技巧可能无关紧要。在我的经验中,由大型扫描图像(例如扫描的书)组成的 PDF 样本是最慢的,并且可以提供良好的测试数据。

于 2016-02-20T17:11:23.833 回答