CATiledLayer中的预加载/预先显示磁贴?

jem*_*ons 12 iphone cocoa cocoa-touch core-animation catiledlayer

在iPhone上(尽管我认为它在Cocoa中是一个同样有效的问题)我有一个围绕由CATiledLayer支持的UIView的UIScrollView.默认情况下,它的工作方式是在我的视口滚动到CATiledLayer的空白部分时加载任何未缓存/未获取的图块.

我想知道的是,是否有办法触发CATiledLayer加载未主动显示的磁贴?例如,我想在当前显示的图块仍然在屏幕外时预加载与当前显示的图块相邻的所有图块,从而避免在异步加载图像时闪烁的空白屏幕闪烁.

有任何想法吗?

Joh*_*ger 14

我认为CATiledLayer不会做你想做的事.还有其他几个选择.首先,您可以禁用图块淡入,并立即显示如下:

@interface NoFadeTiledLayer : CATiledLayer {
}
@end

@implementation NoFadeTiledLayer
+ (CFTimeInterval)fadeDuration {
    return 0.0;
}
@end

@implementation MyViewWithTiledLayer
+ (Class)layerClass {
    return [NoFadeTiledLayer class];
}
...
@end
Run Code Online (Sandbox Code Playgroud)

其次,你可以自己预先获取和缓存相邻的磁贴,这样当CATileLayer调用drawLayer:inContext时它们就可以运行了.我将实现scrollViewDidScroll:和scrollViewDidZoom:来确定相邻的tile和levelOfDetail.然后执行缓存查找并将任何不存在的内容添加到预取/渲染队列中.后台线程可以为队列提供服务,后续的滚动或缩放将清除并重建队列.然后让drawLayer:inContext首先检查缓存,只在必要时才进行提取/渲染.