Слой табличного представления, кажется, влияет на родственные слои - PullRequest
1 голос
/ 29 февраля 2012

У меня есть интересная проблема, связанная с отношениями между родственными слоями в иерархии слоев Core Animation.Вот моя иерархия:

Animation layer: <CALayer: 0x7ccf060> <--- custom animation layer

Content view's sublayers: (
    "<CALayer: 0x7e7db10>", <--- map view layer
    "<CALayer: 0x7cbfe10>", <--- table view layer
    "<CALayer: 0x7ccf060>"  <--- custom animation layer
)

Итак, у меня есть несколько слоев в дереве слоев, один из которых является слоем, который я создаю для анимации (который содержит несколько подслоев, весь контент которых предоставляется из CGImageRef).

Очевидно, что слой анимации - это брат, а не дочерний слой слоя табличного представления.Однако происходит то, что этот пользовательский слой анимации смещается прямо пропорционально contentOffset представления таблицы, т. Е. Сколько я прокручивал.В моем случае слой анимации действительно является представлением изображения табличного представления.

Вот как выглядит табличное представление, прокручиваемое немного перед тем, как вставить слой анимации в качестве родственного элемента:

до http://f.cl.ly/items/0H3Q283V1Z2v0h0c3t10/iOS%20Simulator%20Screen%20shot%20Feb%2028,%202012%2010.47.42%20PM.png

И вот сразу после, когда я рендерил слой табличного представления в CGImageRef и использовал его в качестве исходного содержимого для обычного CALayer 'contents свойства:

после http://f.cl.ly/items/0U1b2L351T3J0j0j1t0F/iOS%20Simulator%20Screen%20shot%20Feb%2028,%202012%2010.29.30%20PM.png

Опять же, содержимое слоя является просто представлением изображения слоя табличного представления, поэтому я не вижу, как contentOffset мог бы повлиять на этот другой слой вообще.Возможно, если бы я добавил слой в качестве подслоя слоя табличного представления, возможно, я бы увидел, где могут возникнуть проблемы.Но этот слой анимации является родственным слоем, так почему он на что-либо влияет?

Вот кадр слоя анимации, который я также зарегистрировал:

Animation layer's frame: {{0, 0}, {320, 372}}

1 Ответ

4 голосов
/ 01 марта 2012

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

При рендеринге сначала переводить Контекст отрицательный в смещение scrollViews CGContextTranslateCTM (ctx, -contentOffset.x, -contentOffset.y); затем выполните рендеринг с помощью [layer renderInContext: ctx];

...