I have a single window with a single custom view in it, and I want the custom view to resize with the window so that it entirely fills it at any time.
If I write:
NSView *contentView = [self.window contentView];
CustomView *customView = [[CustomView alloc] initWithFrame:[contentView bounds]];
[contentView addSubview:customView];
[contentView addConstraint:
[NSLayoutConstraint constraintWithItem:customView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:contentView
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0]];
[contentView addConstraint:
[NSLayoutConstraint constraintWithItem:customView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:contentView
attribute:NSLayoutAttributeHeight
multiplier:1
constant:0]];
Then the window doesn’t let me resize it.
If I add:
[customView setTranslatesAutoresizingMaskIntoConstraints:NO];
Then the custom view doesn’t appear (drawRect: seems to never be called).
I tried different ways (including the visual format @"|[customview]|") but I always run into the same problems. I know it could be done with the older autoresizing system, with:
[customView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
but I want to use the Cocoa Auto Layout system, and I want to use it for more complicated cases (like several custom views that always fill the window).
Does anyone know what is wrong and how I should use the Auto Layout system to get the result that I want?
With Auto Layout, there are (at least) three possible ways to constrain a view so that it occupies the entire window’s content view, resizing when appropriate.
Visual format constraints with regard to superview
Programmatic constraints for the edges
(this should be equivalent to the visual format above)
and
Programmatic constraint for the size
The third approach is the one listed in the question and it may not work if there are further constraints. For example, without:
the original autoresize mask is applied as well, which leads to the behaviour described in the question: the window isn’t resized.
As mentioned by Regexident, you can use:
to debug Auto Layout. It’s worth checking the console output as well.