Я не думаю, что 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: для определения соседних плиток и levelOfDetail. Затем выполните поиск в кэше и добавьте все, что не присутствует, в очередь предварительной выборки / рендеринга. Фоновый поток может обслуживать очередь, а последующие прокрутки или масштабирования очищают и перестраивают очередь. Затем используйте drawLayer: inContext, сначала проверяющий кеш, и только при необходимости извлекайте / визуализируйте.