Как сохранить CALayer в той же позиции при изменении размера родительского NSView?

Представьте маленькую красную рамку (экземпляр CALayer), нарисованную в левом нижнем углу родительского слоя (который является корневым слоем слоя, содержащего NSView).

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

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

Я предположил, что объединение кадра и изменения положения в один CATransaction сделает оба изменения вместе, но это не всегда работает (в документах говорится, что при использовании транзакции анимация будет запускаться одновременно, но, похоже, все еще существует временами состояние гонки).

Как я могу настроить рамку родительского NSView, сохраняя при этом дочерний слой в его воспринимаемой позиции?

Пример и код:

NSView и слой блока

Мои собственные идеи:

  1. Скрыть слой с красной рамкой, обновить положение, снова показать

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


person Mark    schedule 15.09.2011    source источник


Ответы (1)


Попробуйте удалить код, который вы уже сделали, чтобы слой перемещался вместе с видом, и поместите его туда, где вы создаете слой.

boxLayer.autoresizingMask = kCALayerMaxXMargin | kCALayerMinYMargin;
person Alex Zielenski    schedule 22.11.2011