Манипулирование AccessoryView NSSavePanel? - PullRequest
2 голосов
/ 03 марта 2012

У меня есть NSSavePanel, настроенный с дополнительным представлением, которое содержит всплывающее меню формата и представление вкладок таблиц с различными вариантами относительно выбранного формата. Он правильно отображается на панели, но я не могу настроить его размер.

Вызов -setFrameSize для accessoryView приводит к нечетному и неправильному изменению размера один раз, а затем не отвечает на любые последующие вызовы. Другие элементы управления в представлении полностью отказываются отвечать на любые вызовы.

Работает ли NSSavePanel как NSSearchField, который использует только назначенное ему меню в качестве шаблона? Если да, как я могу управлять конкретным экземпляром вспомогательного представления в текущей активной панели сохранения?

1 Ответ

1 голос
/ 04 марта 2012

Мой опыт (особенно с кодом, который должен работать на 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;

Надеюсь, это поможет.

...