CATiledLayer в CALayer

У меня есть мнение с поддержкой CATiledLayer. Я хочу взять видимые плитки из этого CATiledLayer UIView и добавить их в другое представление в качестве поддержки CALayer, таким образом воссоздав видимое изображение в другом UIView, который не использует CATiledLayer.

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

Проблема в том, что я не совсем уверен, как бы это сделать. Любые идеи?


person Gaz_Edge    schedule 18.06.2012    source источник
comment
Значит, вы хотите создать намеренно мозаичный вид и сделать обычный вид, чтобы скрыть мозаичный вид ...? Может быть, это сумасшедший вопрос, но почему он был выложен плиткой с самого начала?   -  person Paul de Lange    schedule 19.06.2012
comment
@PauldeLange - Когда мой тайловый вид перезагружается, он «мерцает», когда тайлы перерисовываются. Под плиточным видом будет UIView, который будет прямой копией плиток выше. Затем, когда плитки перезагружаются, вид снизу будет виден на долю секунды, когда плитки будут перезагружены, что остановит эффект мерцания. Насколько я могу судить, это довольно распространенная практика для графических программ - использование графического буфера для сглаживания последствий рендеринга любого нового контента, указанного выше.   -  person Gaz_Edge    schedule 19.06.2012
comment
Если вы можете визуализировать фоновое изображение быстрее, чем плитки, зачем вам плитки? аффект - ›кстати эффект.   -  person Paul de Lange    schedule 19.06.2012
comment
@pauldeLange - здесь я могу ошибаться, но я предполагаю, что фоновый слой на самом деле будет отображаться быстрее, чем плитки могут загружаться и отображаться, потому что tileLayer должен фактически получать плитки, загружать их и отображать их. Фоновый слой просто должен перерисовать пиксели из буфера CATileLayers - дополнительной обработки не требуется. Он просто берет биты из памяти и повторно отображает их. Вот почему мне было интересно, можно ли взять видимое резервное хранилище CATiledLayer (то есть видимые плитки, сшитые вместе) и назначить его CALayer другого представления для отображения?   -  person Gaz_Edge    schedule 19.06.2012
comment
@Gaz_Edge Я никогда не видел мерцания с CATiledLayer. Когда вы вызываете для него setNeedsDisplay, он сохраняет старое изображение на месте, а ваш drawLayer: inContext: просто рисует поверх него. Возможно, вы захотите показать более подробную информацию о том, как вы рисуете, и какие свойства CATiledLayer вы устанавливаете.   -  person fishinear    schedule 27.06.2012
comment
@fishinear то, что вы говорите, имеет смысл, и я предполагаю, что черепица должна работать, т.е. без мерцания. На самом деле я реализую код рисования в drawRect. Это может быть моей проблемой. Вместо этого попробую метод drawLayer.   -  person Gaz_Edge    schedule 10.07.2012
comment
@Gaz_Edge, это правильно. Вы должны рисовать в drawLayer: inContext: делегата CATiledLayer. В моем случае это всегда контроллер представления.   -  person fishinear    schedule 11.07.2012


Ответы (2)


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

Вы можете визуализировать видимые элементы слоя в CGContextRef с помощью:

- (void)renderInContext:(CGContextRef)ctx

А затем используйте это, чтобы обновить другой уровень, настроив его делегата и реализовав

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 

ss показаны здесь http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

Но, честно говоря, я не думаю, что это эффективно.

person Pochi    schedule 21.06.2012
comment
Спасибо за ответ. Вы говорите, что это неэффективно. Есть ли у вас другие идеи, которые могут помочь решить мою проблему с мерцанием? - person Gaz_Edge; 26.06.2012
comment
@Luis renderInContext, похоже, не работает с CATiledLayer, как CALayer для меня. Плитки вообще не отображаются. Любые идеи? - person Tim; 08.10.2012

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

- (void) display {
    self.contents = nil;
    [super display];
}

Это устранило для меня ряд проблем, но может не решить его для вас. Альтернативой для вас может быть отключение транзакций при обновлении: From Справочник по классу CATransaction

setDisableActions: устанавливает, подавляются ли действия, инициированные в результате изменений свойств, сделанных в этой группе транзакций.

Итак, чтобы использовать это:

[CATransaction begin];
[CATransaction setDisableActions:YES];
// do updating/flickering stuff
[self doFlickeringThing];
[CATransaction commit];
person quellish    schedule 23.06.2012