public override void ViewDidLoad() { base.ViewDidLoad(); View.Layer = new CALayer(); View.Layer.BackgroundColor = NSColor.White.CGColor; // create the sub views var greenView = new NSView(); greenView.Layer = new CALayer(); greenView.Layer.BackgroundColor = NSColor.Green.CGColor; greenView.Layer.BorderColor = NSColor.Black.CGColor; greenView.Layer.BorderWidth = 2; View.AddSubview(greenView); var redView = new NSView(); redView.Layer = new CALayer(); redView.Layer.BackgroundColor = NSColor.Red.CGColor; redView.Layer.BorderColor = NSColor.Black.CGColor; redView.Layer.BorderWidth = 2; View.AddSubview(redView); var blueView = new NSView(); blueView.Layer = new CALayer(); blueView.Layer.BackgroundColor = NSColor.Blue.CGColor; blueView.Layer.BorderColor = NSColor.Black.CGColor; blueView.Layer.BorderWidth = 2; View.AddSubview(blueView); // create the constraints var padding = 10; var superview = View; // basic constraints greenView.MakeConstraints(make => { make.Top.And.Left.EqualTo(superview).Offset(padding); // chain .Top and .Left make.Bottom.EqualTo(blueView.Top()).Offset(-padding); make.Right.EqualTo(redView.Left()).Offset(-padding); make.Width.EqualTo(redView.Width()); make.Height.EqualTo(redView.Height()); make.Height.EqualTo(blueView.Height()); }); // .With and .And are semantic and optional redView.MakeConstraints(make => { make.Top.EqualTo(superview.Top()).With.Offset(padding); // with .Width make.Left.EqualTo(greenView.Right()).Offset(padding); // no .Width make.Bottom.EqualTo(blueView.Top()).And.Offset(-padding); // with .And make.Right.EqualTo(superview.Right()).Offset(-padding); // no .And make.Width.EqualTo(greenView.Width()); make.Height.EqualTo(NSArray.FromNSObjects(new[] { greenView, blueView })); // can pass array of views }); blueView.MakeConstraints(make => { make.Top.EqualTo(greenView.Bottom()).Offset(padding); make.Left.EqualTo(superview.Left()).Offset(padding); make.Bottom.EqualTo(superview.Bottom()).Offset(-padding); make.Right.EqualTo(superview.Right()).Offset(-padding); make.Height.EqualTo(NSArray.FromNSObjects(new[] { greenView.Height(), redView.Height() })); // can pass array of attributes }); // demonstrate update growingButton = new NSButton(); growingButton.Title = "Grow Me!"; growingButton.Layer = new CALayer(); growingButton.Layer.BackgroundColor = NSColor.White.CGColor; growingButton.Layer.BorderColor = NSColor.Green.CGColor; growingButton.Layer.BorderWidth = 3; View.AddSubview(growingButton); growingButton.AddGestureRecognizer(new NSClickGestureRecognizer(_ => { buttonSize = new CGSize(buttonSize.Width * 1.3f, buttonSize.Height * 1.3f); // tell constraints they need updating View.NeedsUpdateConstraints = true; // update constraints now View.UpdateConstraintsForSubtreeIfNeeded(); View.LayoutSubtreeIfNeeded(); })); // demonstrate remake movingButton = new NSButton(); movingButton.Title = "Move Me!"; movingButton.Layer = new CALayer(); movingButton.Layer.BackgroundColor = NSColor.White.CGColor; movingButton.Layer.BorderColor = NSColor.Green.CGColor; movingButton.Layer.BorderWidth = 3; View.AddSubview(movingButton); movingButton.AddGestureRecognizer(new NSClickGestureRecognizer(_ => { topLeft = !topLeft; // tell constraints they need updating View.NeedsUpdateConstraints = true; // update constraints now View.UpdateConstraintsForSubtreeIfNeeded(); View.LayoutSubtreeIfNeeded(); })); }