应用变换后控制 NSView 子层的布局

Control layout of sublayers of NSView with transforms applied

我正在尝试创建一个 NSView 子类,它可以让我访问一个图层,我可以为它控制正常情况下的限制参数,如 anchorPoint 和变换,以及应用动画。

我的计划是创建一个图层托管视图,然后向其根图层添加一个子图层。这工作得很好,除了我很难定位和调整这个子层的大小。我觉得我错过了一些明显的东西,但我想不通。

我的第一次尝试是将根层的 layoutManager 设置为 CAConstraintLayoutManager。这很好用除非 我设置了子层的transform 属性。 CAConstraintLayoutManager 直接更新图层的框架,这会导致旋转变换出现问题。我花了很长时间才弄明白这一点,但我最终确实找到了解释这一点的 documentation

好的,接下来,我做了一个自定义 CALayoutManager,它只调整子层的 boundsposition,而不是改变框架。这似乎可行,但如果我的视图有子视图,则会破坏布局。这让我很吃惊。我想当涉及到其他层时,它会扰乱 NSView 的内部布局系统吗?

因此,我继续使用根层委托方法 func layoutSublayers(of layer: CALayer)。这也破坏了布局,因为我没有意识到 NSView 本身期望成为根层的委托并专门使用该方法。

所以,在这一点上,我不知所措。我不知道如何控制布局, 对子图层应用变换。有人有什么建议吗?

事实证明这个问题有一个明显的答案。 NSView 有一个 layout 方法非常适合这个。我很早就对此进行了试验,但我的代码处于错误状态并且由于其他原因无法正常工作。删除所有 experiments/half-commented 代码后,一切正常!