2017-12-28 25 views
0

Der Versuch, CAConstraints mit CALayer zu verwenden. Nach vielen Versuchen und Suchen kann ich es nicht zum Laufen bringen. Nach dem Drucken: Der Superlayer hat einen Rahmen (sichtbar mit Farbe), der Sublayer hat Beschränkungen, aber nichts wird gezeichnet (Sublayer hat 0 Frames).CALayer, CACstraints funktioniert nicht

Dies ist aus der NSViewController

override func viewDidAppear() { 
     super.viewDidAppear() 

     let layer = CALayer() 
     layer.backgroundColor = NSColor.red.cgColor 

     // centerView is just an NSView, first child of the main view. 
     self.centerView.wantsLayer = true 
     self.centerView.layer?.layoutManager = CAConstraintLayoutManager() 
     self.centerView.layer?.addSublayer(layer) 

     self.centerView.layer?.backgroundColor = NSColor.blue.cgColor 

     layer.addConstraint(CAConstraint(attribute: CAConstraintAttribute.midX, relativeTo: "superlayer", attribute: CAConstraintAttribute.midX)) 
     layer.addConstraint(CAConstraint(attribute: CAConstraintAttribute.midY, relativeTo: "superlayer", attribute: CAConstraintAttribute.midY)) 
     layer.addConstraint(CAConstraint(attribute: CAConstraintAttribute.width, relativeTo: "superlayer", attribute: CAConstraintAttribute.width)) 
     layer.addConstraint(CAConstraint(attribute: CAConstraintAttribute.height, relativeTo: "superlayer", attribute: CAConstraintAttribute.height)) 

     layer.setNeedsDisplay() 
     self.centerView.layer?.setNeedsDisplay() 

} 

Die Superlayer (blau), verhält sich ok, Ändern der Größe und alle. Die Unterschicht (rot), nichts.
Wenn ich den Sublayer-Rahmen einstelle, wird er gezeichnet, bleibt aber statisch.

Antwort

0

Der Zweck dieser Frage war die Größe eines Unterlayers mit einer Fenstergrößenanpassung, die dem Verhalten einer Unteransicht unter Verwendung von NSLayoutConstraints entspricht.

Nachdem in einem Apple sample code suchen und die layoutManager zum Superlayer Einstellung, wo ich darüber eine Laufzeit Beschwerde bekam (da war die Superlayer nicht mein, sondern die direkte view.layer). Dies hat den Anschein, als ob sich die Beschränkungen auf Beziehungen zwischen Unterschichten beziehen und nicht den Einschränkungen der Ansicht selbst folgen.

An dieser Stelle könnte der Titel irreführend sein, aber wenn Sie hier oben versucht haben, das oben genannte Verhalten zu erreichen, habe ich es schließlich gelöst, indem ich autoresizingMask verwendet habe.
Meine NSViewController hat eine NSImageView mit NSLayoutConstraints Setup im Storyboard. Von dort musste ich nur die anfängliche Größe und das Seitenverhältnis einstellen.

// 'self' is an NSImageView subclass 
self.currnetLayer = CALayer() 
self.currnetLayer.bounds = self.bounds 
self.currnetLayer.frame.origin = CGPoint.zero // Initially, origin was negative here. 
self.currnetLayer.autoresizingMask = [.layerWidthSizable, .layerHeightSizable] 
self.currnetLayer.contentsGravity = kCAGravityResizeAspect // Keep aspect ratio 

// ... 
// Setting some animation here 
// ... 

self.layer?.addSublayer(self.currnetLayer)