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

CATiledLayer заглушает плитки перед рисованием содержимого

Все,

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

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

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

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

Обновление

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

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

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

4b9b3361

Ответ 1

Я обнаружил, что если вы устанавливаете levelsOfDetailBias и levelsOfDetail как то же значение (2 в моем случае), то он только перерисовывает фрагменты, которые затрагиваются моим вызовом setNeedsDisplayInRect:, как вы надеетесь.

Однако, если levelOfDetail отличается от LODB, то любые вызовы setNeedsDisplayInRect: перерисовать все фрагменты.

Ответ 2

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

Ответ 3

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

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

Ответ 4

У меня была такая же проблема с 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;

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

Сообщите мне, если кто-то пробовал это.

Ответ 5

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