Как сохранить CALayer в той же позиции при изменении размера родительского NSView? - PullRequest
5 голосов
/ 15 сентября 2011

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

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

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

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

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

Пример и код:

NSView and box layer

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

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

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

1 Ответ

0 голосов
/ 22 ноября 2011

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

boxLayer.autoresizingMask = kCALayerMaxXMargin | kCALayerMinYMargin;
...