3

如何将视图添加到窗口,以便调整视图大小以适应窗口框架?

问题

我正在制作一个包含 2 个视图的工作表窗口,其中一次只有一个可见,因此视图与窗口的大小相同很重要。我的问题是 view0 适合,而 view1 不适合,反之亦然。我不知道如何给它们与窗口相同的大小。

可能的解决方案

我可以确保两个视图在 Interface Builder 中具有完全相同的大小,然后它就可以工作了。但是我正在寻找一种以编程方式执行此操作的方法。


视图0截图

您可以在下面看到顶部和右侧的自动调整大小问题,其中视图以某种方式被剪裁。

视图0
(来源:flickr.com


视图1的屏幕截图

此视图已正确调整大小。

视图1
(来源:flickr.com


这是我的代码

可以在将视图添加到窗口之前调整它们的大小吗?还是像我现在所做的那样,在更改窗口框架的同时逐一添加视图会更好。你怎么做呢?

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];
4

2 回答 2

7

解决了!我在stackoverflow上找到了一个解决方案。

如果这段代码可以更短,那就太好了。

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];
于 2010-04-25T12:19:15.333 回答
-1

窗口无法知道要自动调整哪个视图。所以必须设置 AutoresizezingMask

[查看 setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

于 2012-03-17T16:14:05.100 回答