cocoa - addSubview 和自动调整大小

标签 cocoa interface-builder nsview nswindow autosize

如何将 View 添加到窗口,以便调整 View 大小以适合窗口框架?

问题

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

可能的解决方案

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

<小时/>

view0 的屏幕截图

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

view0
(来源:flickr.com)

<小时/>

View 1的屏幕截图

此 View 已正确调整大小。

view1
(来源:flickr.com)

<小时/>

这是我的代码

在将 View 添加到窗口之前可以调整 View 的大小吗?或者像我现在所做的那样更好,在更改窗口框架时将 View 一一添加。你是怎么做到的?

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

最佳答案

解决了!我有found a solution这里在 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];

关于cocoa - addSubview 和自动调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2708072/

相关文章:

objective-c - 检测其他按钮点击(NSUserNotification)

ios - 如何在界面生成器上将 UITextView 作为 subview 添加到 UIImageView 中?

iphone - UISegmentedControl 选定索引始终为 0?

ios - UISlider setMaximumTrackTintColor在IB中不起作用

macos - 如何使 NSMenuItem 中的自定义 NSView 成为FirstResponder?

nsview - 只需在 NSScrollView 中嵌入自定义 NSView 即可杀死它

objective-c - 用NSView制作淡入淡出效果

objective-c - 在 Mac 应用程序中交换 View

cocoa - 在单个 NSSlider 中使用多个 NSSliderCell

cocoa - 奇怪的行为: dragging from Stacks to status item doesn't work