Мой опыт (особенно с кодом, который должен работать на 10.5) показал, что для обработки перестановочных размеров в accessoryView для NSSavePanel нам пришлось удалить (установить значение nil) и повторно добавить его.Под 10.7 (и, я полагаю, 10.6), кажется, достаточно вызвать [savePanel layoutIfNecessary]
после изменения frameSize.
В этом случае, поскольку вы упоминаете, что используете невидимые представления вкладок.Обычно представление вкладок имеет постоянный размер.Если вы хотите изменить размер NSSavePanel на основе содержимого различных подпредставлений, вы можете сохранить их как отдельные представления (в том же или других файлах NIB) и загрузить их как дочерние представления в NSSavePanel.
Я успешно сделал это в ситуации, когда NIB были динамически загружены из списка подключаемых модулей на диске, где я использовал один общий вид, который содержал всплывающее меню, а затем изменил размер этого вида с помощью * 1006.* чтобы изменить его до добавления дочернего представления к нему.Затем я использовал addSubview:
, чтобы добавить подпредставление к моему существующему представлению, и вызвал [savePanel layoutIfNecessary]
после изменения размера и добавления подпредставления.
Вот фрагмент из четырех добавлений exportAccessoryViewController (это для нас то, что изменится)в зависимости от выбора всплывающего меню) в нашем существующем представлении exportFormatOptionsView (которое содержит всплывающее меню):
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;
Надеюсь, это поможет.