在iPhone上(虽然我认为它在Cocoa中是一个同样有效的问题)我有一个围绕由CATiledLayer支持的UIView的UIScrollView。默认情况下,它的工作方式是在我的视口滚动到CATiledLayer的空白部分时加载任何未缓存/未获取的图块。
我想知道的是,是否有办法触发CATiledLayer加载未主动显示的磁贴?例如,我想在当前显示的图块仍在屏幕外时预加载与当前显示的图块相邻的所有图块,从而避免在异步加载图像时闪烁一个空白屏幕。
有什么想法吗?
答案 0 :(得分:14)
我认为CATiledLayer不会做你想要的。还有其他几个选择。首先,您可以禁用平铺淡入,并立即显示以下内容:
@interface NoFadeTiledLayer : CATiledLayer {
}
@end
@implementation NoFadeTiledLayer
+ (CFTimeInterval)fadeDuration {
return 0.0;
}
@end
@implementation MyViewWithTiledLayer
+ (Class)layerClass {
return [NoFadeTiledLayer class];
}
...
@end
其次,你可以自己预先获取和缓存相邻的磁贴,这样当CATileLayer调用drawLayer:inContext时它们就可以运行了。我将实现scrollViewDidScroll:和scrollViewDidZoom:来确定相邻的tile和levelOfDetail。然后执行缓存查找并将任何不存在的内容添加到预取/渲染队列中。后台线程可以为队列提供服务,后续的滚动或缩放将清除并重建队列。然后让drawLayer:inContext首先检查缓存,只在必要时才进行提取/渲染。
答案 1 :(得分:4)
CATileLayer是令人沮丧的课程之一,它做了一件好事,但没有灵活性。
此时留给我们的只是创造力:
1)使您的滚动视图变得巨大。在我看到“空白”瓷砖之前,我尝试了5倍大小的屏幕。警惕记忆的使用!即使用户只看到2%,你也会画到一个巨大的区域。
2)有两个版本的图像,一个高分辨率和一个低分辨率。你应该能够快速地对低分辨率进行blit,基本上你会得到“模糊”而不是“空白”牌。 Apple的示例代码ZoomingPDFViewer向您展示了如何执行此操作。
http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html
当然,如果你想投入时间,两者的某些组合可能会奏效。
答案 2 :(得分:0)
您应该尝试在要显示的区域上调用setNeedsDisplayInRect :.如果要保留在切片边界内,可以使用tileSize属性来计算切片边界。
但我不确定这是否有效,我们不知道磁贴缓存机制是如何工作的。