私の経験では (特に 10.5 で実行する必要があるコードの場合)、NSSavePanel のアクセサリビューでサイズの並べ替えを処理するために、削除 (nil に設定) してから再度追加する必要がありました。10.7 (そして、10.6 だと思います) では[savePanel layoutIfNecessary]
、frameSize を変更した後に呼び出すだけで十分なようです。
この場合、非表示のタブ ビューを使用していると述べているためです。通常、タブ ビューのサイズは一定です。さまざまなサブビューの内容に基づいて NSSavePanel のサイズを変更する場合は、それらを (同じまたは他の NIB ファイル内の) 別のビューとして保持し、NSSavePanel の子ビューとしてロードすることができます。
NIB がプラグイン モジュールのディスク上のリストから動的にロードされた状況で、これを正常に実行しました。ここでは、ポップアップ メニューを含む単一の全体ビューを使用-setFrameSize:
し、変更するために使用してそのビューのサイズを変更しました。子ビューを追加する前に。次にaddSubview:
、既存のビューにサブビューを追加し[savePanel layoutIfNeeded]
、サイズを変更してサブビューを追加した後に呼び出しました。
これは、既存の exportFormatOptionsView ビュー (ポップアップ メニューを含む) に exportAccessoryViewController (これは、ポップアップ メニューの選択に基づいて変化するものです) を追加する 4 つのスニペットです。
NSSize currentSize = [exportFormatOptionsView bounds].size;
NSView *newView = [exportAccessoryViewController view];
NSSize newSize = NSMakeSize( currentSize.width, currentSize.height+[newView bounds].size.height);
// resize the parent view
[exportFormatOptionsView setFrameSize: newSize];
// move the child view
[exportFormatOptionsView addSubview: newView];
もちろん、これらを動的に切り替えるときは、中間ビューのビュー サイズを元のサイズに戻す必要があるため、後で補足ビューを追加できます。
NSSize currentSize = [exportFormatOptionsView bounds].size;
NSView *oldView = [exportAccessoryViewController view];
// pull it out
[oldView removeFromSuperview];
NSSize newSize = NSMakeSize( currentSize.width, currentSize.height-[oldView bounds].size.height);
[exportFormatOptionsView setFrameSize: newSize];
exportAccessoryViewController = nil;
お役に立てれば。