Подтвердить что ты не робот

Preload/preisplay плитки в CATiledLayer?

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

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

Любые идеи?

4b9b3361

Ответ 1

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

Ответ 2

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

В этот момент все, что осталось для нас, - это творчество:

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

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

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

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

Ответ 3

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

Но я точно не знаю, будет ли это работать, и мы не знаем, как работает механизм кэширования плитки.