CATiledLayer заглушает плитки перед рисованием содержимого
Все,
У меня возникли проблемы с поведением, которое я хочу от CATiledLayer. Есть ли способ, с помощью которого я могу вызвать перерисовку плиток без побочного эффекта, чтобы их области были очищены до белого? Я уже подклассифицировал CATiledLayer, чтобы установить fadeDuration для возврата 0.
Чтобы быть более конкретным, вот подробности того, что я вижу и чего я пытаюсь достичь:
- У меня есть UIScrollView с большим размером контента... ~ 12000x800. Его просмотр содержимого - это UIView, поддерживаемый CATiledLayer.
- UIView визуализируется с большим количеством нарисованных линий
- Все работает нормально, но содержимое UIVEW иногда меняется. Когда это произойдет, я хотел бы перерисовать плитки как можно проще. Когда я использую setNeedsDisplay в представлении, плитки перерисовываются, но сначала очищаются до белого, и перед тем, как будет нарисовано новое содержимое, потребуется небольшая часть секунды. Я уже подклассифицировал CATiledLayer, чтобы fadeDuration был установлен в 0.
- Поведение, которое я хочу, похоже, должно быть возможно... когда вы увеличиваете масштаб прокрутки и контент перерисовывается с более высоким разрешением, там нет гашения перед перерисованием; новый контент рисуется прямо поверх старого. Это то, что я ищу.
Спасибо; Я ценю ваши идеи.
Обновление
Только для того, чтобы следить - я понял, что плитки не очищаются до белого цвета до перерисовывания, их полностью вынимают; белый, который я видел, - это цвет представления, который находится под моим взглядом, поддерживаемым CATiledLayer.
В качестве быстрого взлома/исправления я помещаю UIImageView под UIScrollView, и перед запуском перерисовки представления, поддерживаемого CATiledLayer, я визуализирую его видимый раздел в UIImageView и покажу его. Это значительно улучшает перерисовку.
Если у кого-то есть лучшее решение, например, чтобы убрать фрагменты, предназначенные для перерисовки, прежде чем их перерисовать, я все равно буду их слушать.
Ответы
Ответ 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 файла, состоящего из больших отсканированных изображений (например, отсканированной книги), наиболее медленный из моих опытов и делает хорошие тестовые данные.