CATiledLayer заглушки плитки перед нанесением содержимого - PullRequest
12 голосов
/ 10 ноября 2009

All

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

Чтобы быть более конкретным, вот детали того, что я вижу и чего я пытаюсь достичь:

  • У меня есть UIScrollView с большим размером контента ... ~ 12000x800. Его представление содержимого представляет собой UIView, поддерживаемый CATiledLayer.
  • UIView визуализируется с множеством нарисованных пользователем линий
  • Все работает нормально, но содержимое UIView иногда меняется. Когда это произойдет, я бы хотел перерисовать плитки как можно более плавно. Когда я использую setNeedsDisplay в представлении, плитки перерисовываются, но сначала они очищаются до белого, и перед прорисовкой нового контента происходит задержка в доли секунды. Я уже создал подкласс CATiledLayer, так что fadeDuration установлен на 0.
  • Поведение, которое я хочу, похоже, должно быть возможным ... когда вы увеличиваете представление прокрутки, и содержимое перерисовывается с более высоким разрешением, перед перерисовкой нет пропусков; новый контент рисуется прямо поверх старого. Это то, что я ищу.

Спасибо; Я ценю ваши идеи.

Обновление

Просто чтобы продолжить - я понял, что плитки не были очищены до белого перед перерисовкой, они были полностью удалены; белый цвет, который я видел, - это цвет вида, который находится под моим видом на CATiledLayer.

В качестве быстрого взлома / исправления я поместил UIImageView под UIScrollView, и перед тем, как вызвать перерисовку представления с поддержкой CATiledLayer, я рендерил его видимый раздел в UIImageView и дал ему показать. Это значительно сглаживает перерисовку.

Если у кого-то есть лучшее решение, например, не дать плиткам с перерисовкой уйти до того, как они будут перерисованы, я все равно хотел бы услышать это.

Ответы [ 5 ]

4 голосов
/ 28 марта 2013

Я обнаружил, что если вы установили значения valuesOfDetailBias и levelsOfDetail в одно и то же значение (в моем случае это 2), то он будет перерисовывать только те плитки, к которым обращается мой вызов setNeedsDisplayInRect:

Однако, если levelsOfDetail отличается от LODB, то любые вызовы setNeedsDisplayInRect: redraw all плитки.

1 голос
/ 19 мая 2010

Другой потенциальный вариант - использовать тот же делегат для рисования контента в контексте растрового изображения и замены растрового изображения в резервном хранилище после обновления содержимого.Это должно дать результат без мерцания.При этом я не могу сказать вам, как это можно сделать, и одна из приятных особенностей CATiledLayers заключается в том, что они автоматически генерируют плитки при масштабировании и предварительно генерируют плитки при панорамировании при увеличении.Посмотрите, как вы реализуете свое приложение.Я искал недели, чтобы найти пример, который использует комбинацию UIScrollView и CATILLAYER-back view с большим количеством пользовательских нарисованных линий.У Apple есть отличный пример кода, но он включает в себя изображения, а не штриховые рисунки, поэтому мне не поможет.

1 голос
/ 16 января 2010

Вы можете добавить еще один слой (возможно, CATiledLayer) позади существующего мозаичного слоя. (Вроде решения с двойной буферизацией.) Вы должны вызывать setNeedsDisplay: на втором слое из таймера, который срабатывает через несколько секунд, чтобы убедиться, что этот слой не перерисовывается в то же время, что и передний слой.

0 голосов
/ 20 февраля 2016

Прочитав эти ответы без решения, я обнаружил, что мозаичное построение страницы было основной фоновой задачей.
Подготовка моего изображения-заполнителя в формате Lo-Res в очереди с высоким приоритетом решила эту проблему - изображения теперь появляются, когда происходит разбиение на листы. Кэширование изображений-заполнителей еще больше улучшает их внешний вид - они появляются до того, как начинается мозаика.
С более новыми устройствами, такими быстрыми, эти трюки могут не иметь значения. Образец PDF, состоящий из больших отсканированных изображений (например, отсканированной книги), показывает самый медленный из моих опытов и дает хорошие результаты испытаний.

0 голосов
/ 01 июля 2010

У меня была такая же проблема с iPad.

Решение оказалось более простым, чем я думал, и гораздо более простым, чем использование UIImageView для отображения экрана перед перерисовкой ...:

Только не устанавливайте цвет фона для слоя!

У меня CATiledLayer установлен аналогичным образом:

layer = [[CATiledLayer alloc] init];
layer.masksToBounds = YES;
layer.contentsGravity = kCAGravityLeft;

//layer.backgroundColor = [[UIColor whiteColor] CGColor];

layer.tileSize = CGSizeMake(1004.0, 1004.0);
layer.levelsOfDetail = 16;
layer.levelsOfDetailBias = 8;

Обратите внимание, что я закомментировал цвет фона слоя установки линии на белый. После этого пропал белый пробел перед перерисовкой!

Дайте мне знать, если кто-нибудь пробовал это.

...