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

Mar*_*ark 5 core-animation calayer nsview catransaction

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

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

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

我认为将框架和位置变换包装CATransaction在一起会使两个变化在一起,但这并不总是有效(文档说通过使用事务动画将同时开始,但似乎仍然存在竞争条件有时).

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

示例和代码:

NSView和框图层

我自己的想法:

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

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

Ale*_*ski 0

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

boxLayer.autoresizingMask = kCALayerMaxXMargin | kCALayerMinYMargin;
Run Code Online (Sandbox Code Playgroud)