Preload/preisplay плитки в CATiledLayer?
На iPhone (хотя я представляю, что это одинаково важный вопрос в Cocoa), у меня есть UIScrollView вокруг UIView, поддерживаемый CATiledLayer. По умолчанию он работает, чтобы загрузить любые незашифрованные/незапечатанные фрагменты, когда моя область просмотра прокручивается над пустой частью CATiledLayer.
Что я хотел бы знать, есть ли способ запустить CATiledLayer для загрузки плитки, которая не активно отображается? Я хотел бы, например, предварительно загрузить все плитки, прилегающие к отображаемому в данный момент фрагменту, в то время как они все еще находятся вне экрана, таким образом избегая мигания пустого экрана, который исчезает в изображении после его асинхронной загрузки.
Любые идеи?
Ответы
Ответ 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 для вычисления границ плитки.
Но я точно не знаю, будет ли это работать, и мы не знаем, как работает механизм кэширования плитки.