Фоновое изображение для CATiledLayer

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

я имею CATiledLayer работает аналогично примеру, который можно найти в документации iOS, и я рассчитываю, в какой строке и столбце drawRect:(CGRect) rect пытается нарисовать его содержание.

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

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

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

Кто-нибудь знает, как этого добиться?

1 ответ

Я наконец понял это и спасибо за ключевой комментарий.

Что ты должен сделать:

  1. Создайте подкласс CATiledLayer со всей логикой динамической загрузки внутри функции drawLayer:inContext: - эта функция похожа на drawRect: в представлении
  2. Инициируйте свой новый подкласс CATiledLayer
  3. Init new CALayer с изображением низкого разрешения
  4. Создайте новый UIView *myView = [UIView ...] или UIImageView (зависит от ваших потребностей)
  5. Поместите два слоя в myView.layer как subLayer

UIView *imageView = [[UIView alloc] initWithFrame:viewFrame];

DCTiledLayer *tiledLayer = [[DCTiledLayer alloc] initWithData:myData];

CALayer *lowResLayer = [CALayer layer];
lowResLayer.position = CGPointMake(CGRectGetMidX(viewFrame), CGRectGetMidY(viewFrame));
lowResLayer.bounds = viewFrame;
lowResLayer.contents = (id)[lowResImage CGImage];

[imageView.layer addSublayer:lowResLayer];
[imageView.layer addSublayer:tiledLayer];

Отлично работает.:)

Другие вопросы по тегам