Предварительно загружать / отображать плитки в CATiledLayer? - PullRequest
12 голосов
/ 16 июля 2009

На iPhone (хотя я думаю, что этот вопрос одинаково актуален в Какао), у меня есть UIScrollView вокруг UIView, поддерживаемый CATiledLayer. По умолчанию он работает так, чтобы загружать любые незакэшированные / неснятые листы, когда мой видовой экран прокручивает пустой раздел CATiledLayer.

Что я хотел бы знать, так это то, есть ли способ запустить CATiledLayer для загрузки плитки, которая не отображается активно? Я хотел бы, например, предварительно загрузить все тайлы, смежные с отображаемым в данный момент тайлом, пока они все еще находятся вне экрана, таким образом, избегая мигания пустого экрана, который исчезает на изображении после асинхронной загрузки.

Есть идеи?

Ответы [ 3 ]

14 голосов
/ 02 марта 2011

Я не думаю, что 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, сначала проверяющий кеш, и только при необходимости извлекайте / визуализируйте.

4 голосов
/ 28 февраля 2011

CATileLayer - это один из тех разочаровывающих классов, в котором он делает одну великолепную вещь, но не обладает гибкостью.

На данный момент нам остается только креативность:

1) Сделайте ваш вид прокрутки огромным. Я попробовал 5x размер экрана, прежде чем перестал видеть «пустые» плитки. Будьте осторожны с использованием памяти! Вы рисуете в огромную область, хотя пользователь видит только 2%.

2) Имейте две версии вашего изображения, один с высоким разрешением и один с низким разрешением. Вы должны быть в состоянии быстро перевернуть низкое разрешение, и в основном вы получите "размытые" вместо "пустых" плиток. Пример кода Apple ZoomingPDFViewer показывает, как это сделать.

http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html

Конечно, некоторая комбинация двух может сработать, если вы хотите потратить время.

0 голосов
/ 16 июля 2009

Вы должны попробовать вызвать setNeedsDisplayInRect: в областях, которые вы хотите отобразить. Если вы хотите не выходить за границы листов, вы можете использовать свойство tileSize для вычисления границ листов.

Но я точно не знаю, сработает ли это, и мы не знаем, как работает механизм кэширования тайлов.

...