Macos 将CAConstraints与NSView层一起使用

Macos 将CAConstraints与NSView层一起使用,macos,layer,nsview,Macos,Layer,Nsview,我希望NSView的子层随视图增长/收缩,以便其帧自动匹配视图的边界,而无需显式重置它 假设视图的主层始终与视图匹配,我尝试了以下代码: let layer = self.layer! // It is guaranteed to exist layer.backgroundColor = NSColor.white layer.name = "MainLayer" let sublayer = CALayer() sublayer.backgroundColor = NSColor.blac

我希望NSView的子层随视图增长/收缩,以便其帧自动匹配视图的边界,而无需显式重置它

假设视图的主层始终与视图匹配,我尝试了以下代码:

let layer = self.layer!  // It is guaranteed to exist
layer.backgroundColor = NSColor.white
layer.name = "MainLayer"
let sublayer = CALayer()
sublayer.backgroundColor = NSColor.black

layer.addSublayer(sublayer)

sublayer.addConstraint(CAConstraint.init(attribute: .width, relativeTo: "MainLayer", attribute: CAConstraintAttribute.width))
sublayer.addConstraint(CAConstraint.init(attribute: .height, relativeTo: "MainLayer", attribute: CAConstraintAttribute.height))
猜猜看:除非显式设置其帧,否则不会看到任何子层。
还尝试了相反方向的约束:从层到子层-相同的结果

您没有在代码中设置CAConstraintLayerManager:

layer.layoutManager=CAConstraintLayoutManager()

请参阅中的代码段:


i谢谢您的参考。现在效果很好。除了“宽度”和“高度”之外,我还必须至少为maxX和maxY添加约束,并重写makeBackingLayer函数,以消除运行时错误:“设置AppKit提供的层的布局管理器是非法的…”无需命名主层,因为“superlayer”总是指。。。猜猜看。祝你一切顺利!