如何在调整父NSView的同时将CALayer保持在相同位置?

时间:2011-09-15 13:14:00

标签: core-animation calayer nsview catransaction

想象一下在其父图层左下角绘制的一个小红框(CALayer实例)(这是托管NSView的图层的根图层)。

当父视图的框架发生变化时,红色框应保持在屏幕上的相同位置。我这样做是通过相对于父视图的左下角调整它的位置。

问题在于,在某些情况下会出现闪烁,我可以看到红框图层在扩展框架的左下角被绘制,然后显示在正确的位置。

我认为将框架和位置更改包装成一个CATransaction会使两个更改一起进行,但这并不总是有效(文档说通过使用事务动画将同时开始,但有时似乎还存在竞争条件。)

如何在保持子图层处于感知位置的同时调整父NSView的框架?

示例和代码:

NSView and box layer

我自己的想法:

  1. 隐藏红色框图层,更新位置,再次显示

  2. 使用约束将其绑定到右上角。问题是这个偏移也可能会改变,我将不得不更新可能导致同样闪烁问题的约束。

1 个答案:

答案 0 :(得分:0)

尝试删除您已经创建的代码,使图层随视图移动,并将其放在创建图层的位置。

boxLayer.autoresizingMask = kCALayerMaxXMargin | kCALayerMinYMargin;