所有
我无法从CATiledLayer获取我想要的行为。有没有一种方法可以触发瓷砖重绘而不会产生副作用,即它们的区域首先被清除为白色?我已经将CATiledLayer子类化,将fadeDuration设置为0。
更具体地说,以下是我所看到的以及我正在努力实现的细节:
感谢;我很感激你的想法。
更新:
只是为了跟进 - 我意识到在重绘之前瓷砖没有被清理成白色,它们被完全取出;我看到的白色是我的CATiledLayer支持的视图下面的视图的颜色。
作为一个快速入侵/修复,我在UIScrollView下面放置了一个UIImageView,在触发重新绘制CATiledLayer支持的视图之前,我将其可见部分呈现到UIImageView中并让它显示出来。这显着平滑了重绘。
如果有人有更好的解决方案,比如在重新绘制之前保持重绘目标图块不会消失,我仍然希望听到它。
答案 0 :(得分:4)
我发现如果你将levelsOfDetailBias和levelsOfDetail都设置为相同的值(在我的情况下是2),那么它只会重绘我的setNeedsDisplayInRect:call所触及的tile,正如你所希望的那样。
但是如果levelsOfDetail与LODB不同,那么对setNeedsDisplayInRect的任何调用:重绘 all 瓦片。
答案 1 :(得分:1)
您可以在现有平铺图层后面添加另一个图层(可能是CATiledLayer)。 (双缓冲解决方案的排序。)您可以从几秒钟后触发的计时器调用第二层上的setNeedsDisplay:
,以确保该图层不会与前面层同时重绘。 / p>
答案 2 :(得分:1)
另一个可能的选择是使用相同的委托将内容绘制到位图上下文,并在刷新内容后将位图交换到后备存储。这应该产生无闪烁的结果。话虽如此,我无法告诉你如何做到这一点,而关于CATiledLayers的一个好处是它们在缩放时自动生成切片并在放大后平移预生成切片。
我想看看你如何实现你的应用程序。我一直在寻找一个使用UIScrollView和CATiledLayer-back视图的组合的示例,其中包含许多自定义绘制的线条。 Apple有一些很棒的示例代码 - 但它们都涉及图像而不是艺术线条,所以对我没用。
答案 3 :(得分: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;
请注意,我已将线设置图层的背景颜色注释为白色。 之后,重绘问题之前的白色空白消失了!
如果有人尝试过,请告诉我。
答案 4 :(得分:0)
在没有解决方案的情况下阅读这些答案后,我发现平铺页面是主要的后台任务 在高优先级队列上准备我的lo-res占位符图像解决了这个问题 - 图像现在在平铺发生时出现。缓存占位符图像进一步改善了它们的外观 - 它们出现在平铺开始之前 对于较新的设备,将它拼接得如此之快,这些技巧可能并不重要。包含大型扫描图像(例如扫描书籍)的PDF样本是我体验中最慢的,并且可以获得良好的测试数据。