6

NSView がビューの自動サイズ変更を行う方法を理解する必要があります。IB ですべてを設定すると、サブビューのサイズが適切に変更されます (マウスでウィンドウのサイズを変更すると)。ただし、[myMainView setFrame:]新しいフレーム四角形を使用しても何も起こりません。サブビューはすべて元のサイズのままです (メイン ビューのサイズが正しい場合でも)。Child'sresizeWithOldSuperviewSize:が呼び出されますが、まだ適切なサイズではありません。

画面(画面#1)、ラベル、画像、ビデオにココア要素がいっぱいあります。これらの要素には明確に定義されたレイアウトがあります。非常にうまく機能するInterface Builderを介して自動サイズ変更動作をセットアップしました。メイン ウィンドウのサイズを変更すると、満足のいく方法で要素のサイズが変更されます。

ここで、ユーザーが「次へ」ボタンをクリックすると、2 番目の画面いっぱいの要素 (画面 #2) が描画されます。私のレイアウトは、正規の画面サイズ (800x600 など) に基づいて構築されています。しかし、画面 #1 でサイズが変更されたため、ウィンドウは大きく (または小さく) なっています。そのため、要素は、使用可能なスペースを埋めるために適切にサイズ調整されるのではなく、ウィンドウ内の小さな領域しか占めていません。これらの要素をスケーリングしたい。

自動サイズ変更の仕組みを誤解していますか? NSView の下にある自動サイズ変更機構を手動でトリガーするにはどうすればよいですか?

私ができることは2つあります。

  1. 元のサイズに対する現在の画面サイズに基づいて、要素のサイズを手動で変更します。このオプションは私のお気に入りではありません。なぜなら、NSView で既に動作しているコードを書き直す必要があるように見えるからです (自動サイズ変更の動作
  2. 私の 2 番目のオプションは、前述の NSView の自動サイズ変更マジックを呼び出すことです。ドキュメンテーションは、[NSView setFrame:] が私のためにそれを行うことを意味します。私が試したのは、コンテンツ ビューのサイズを元の画面サイズ (800x600) に変更し、要素をレンダリングしてから、現在のウィンドウ サイズにサイズ変更することでした。概念的には、手動でウィンドウのサイズを変更するのと同じではありませんか? そうではないようです。繰り返しますが、このオプションは、記述して維持する必要のあるコードの量を最小限に抑えるため、推奨されます。
4

2 に答える 2

20

このコード

NSView* superView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
NSView* subView   = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
[superView addSubview:subView];

[superView setAutoresizesSubviews:YES];
[subView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

NSLog(@"subview's frame before resizing: %@", NSStringFromRect([subView frame]));
[superView setFrame:NSMakeRect(0, 0, 200, 100)];
NSLog(@"subview's frame after  resizing: %@", NSStringFromRect([subView frame]));

期待される結果が得られます:

[...] サイズ変更前のサブビューのフレーム: {{0, 0}, {100, 100}}
[...] サイズ変更後のサブビューのフレーム: {{0, 0}, {200, 100}}

あなたの問題は他の場所にあります。サイズ変更が発生した時点で、コンテナー ビューの 1 つがウィンドウのビュー階層の一部ではないことが予想されます。

問題の適切な解決策は、タブなしで NSTabView を使用することです。これは、すべてのビューが常にウィンドウ内にあり (おそらく非表示)、タブビューがサイズ変更を処理するためです。

もう 1 つの解決策は、複数のビューを重ね合わせて、setHidden:1 つだけを表示するために使用することです。

于 2009-06-16T17:30:47.240 に答える
3

私のアプローチが正しいことがわかりました。フレーム サイズを正しくない値に設定していたため、期待どおりの動作が得られませんでした。どー。

于 2009-06-17T23:23:17.227 に答える