3

ウィンドウにビューを追加して、ウィンドウフレーム内に収まるようにビューのサイズを変更するにはどうすればよいですか?

問題

2つのビューを含むシートウィンドウを作成していますが、一度に1つしか表示されないため、ビューのサイズがウィンドウと同じであることが重要です。私の問題は、view0が正しく適合し、view1が適合しないか、またはその逆であるということです。窓と同じ大きさにする方法がわかりません。

考えられる解決策

両方のビューがInterfaceBuilder内で正確に同じサイズであることを確認できれば、機能します。しかし、私はこれをプログラムで行う方法を探しています。


view0のスクリーンショット

以下に、ビューが何らかの形でクリップされている上部と右側の自動サイズ変更の問題を示します。

view0
(ソース:flickr.com


view1のスクリーンショット

このビューは正しくサイズ変更されます。

view1
(ソース:flickr.com


これが私のコードです

ビューをウィンドウに追加する前に、ビューのサイズを変更できますか。または、ウィンドウフレームを変更しながら、ビューを1つずつ追加するのと同じように行う方がよいでしょう。どうしますか?

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 に答える