How does one add views to a window, so that the views are resized to fit within the window frame?
I'm making a sheet window containing 2 views, where only one of them is visible at a time, so it's important that the views have the same size as the window. My problem is that either view0 fits correctly and view1 doesn't or the other way around. I can't figure out how to give them the same size as the window.
I could just make sure that both views have precisely the same size within Interface Builder, then it would work. However I'm looking for a way to do this programmatically.
Below you can see the autoresizing problem in the top and the right side, where the view is somehow clipped.
(source: flickr.com)
This view is resized correctly.
(source: flickr.com)
Can the views be resized before adding them to the window. Or is it better to do as I do now where the views are added one by one while changing the window frame. How do you do it?
NSView* view0 = /* a view made with IB */;
NSView* view1 = /* another view made with IB */;
NSWindow* window = [self window];
NSRect window_frame = [window frame];
NSView* cv = [[[NSView alloc] initWithFrame:window_frame] autorelease];
[window setContentView:cv];
[cv setAutoresizesSubviews:YES];
// add subview so it fits within the contentview frame
{
NSView* v = view0;
[v setHidden:YES];
[v setAutoresizesSubviews:NO];
[cv addSubview:v];
[v setFrameOrigin:NSZeroPoint];
[window setFrame:[v frame] display:NO];
[v setAutoresizesSubviews:YES];
}
// add subview so it fits within the contentview frame
{
NSView* v = view1;
[v setHidden:YES];
[v setAutoresizesSubviews:NO];
[cv addSubview:v];
[v setFrameOrigin:NSZeroPoint];
[window setFrame:[v frame] display:NO];
[v setAutoresizesSubviews:YES];
}
// restore original window frame
[window setFrame:window_frame display:YES];
[view0 setHidden:NO];
[view1 setHidden:YES];
Solved! I have found a solution here on stackoverflow.
Would be nice if this code could be made shorter though.
NSView* view0 = /* a view made with IB */;
NSView* view1 = /* another view made with IB */;
NSWindow* window = [self window];
NSRect window_frame = [window frame];
NSView* cv = [[[NSView alloc] initWithFrame:window_frame] autorelease];
[window setContentView:cv];
[cv setAutoresizesSubviews:YES];
// add subview so it fits within the contentview frame
{
NSView* v = view0;
NSRect vframe = [v frame];
[v setHidden:YES];
[v setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
NSView* tmp_superview = [[[NSView alloc] initWithFrame:vframe] autorelease];
[tmp_superview addSubview:v];
[tmp_superview setAutoresizesSubviews:YES];
[tmp_superview setFrame:window_frame];
[v removeFromSuperview];
[cv addSubview:v];
}
// add subview so it fits within the contentview frame
{
NSView* v = view1;
NSRect vframe = [v frame];
[v setHidden:YES];
[v setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
NSView* tmp_superview = [[[NSView alloc] initWithFrame:vframe] autorelease];
[tmp_superview addSubview:v];
[tmp_superview setAutoresizesSubviews:YES];
[tmp_superview setFrame:window_frame];
[v removeFromSuperview];
[cv addSubview:v];
}
[view0 setHidden:NO];