操纵NSSavePanel的accessoryView?

时间:2012-03-03 04:58:11

标签: objective-c macos cocoa accessoryview nssavepanel

我有一个NSSavePanel设置了一个附件视图,其中包含一个格式弹出菜单和一个tabless tabview,其中包含有关所选格式的各种选项。它正确显示在面板上,但我似乎无法调整其大小。

在accessoryView上调用-setFrameSize导致奇数和不正确的大小调整一次,然后对任何后续调用都没有响应。视图中的其他控件完全拒绝响应任何调用。

NSSavePanel是否像NSSearchField一样工作,它只使用其指定的菜单作为模板?如果是这样,我如何操作当前活动保存面板中附件视图的特定实例?

1 个答案:

答案 0 :(得分:1)

我的经验(特别是对于必须在10.5上运行的代码),为了处理accessoryView for NSSavePanel中的置换大小,我们必须删除(将其设置为nil)并重新添加它。在10.7(并且,我相信,10.6)下,在更改frameSize之后调用[savePanel layoutIfNecessary]似乎就足够了。

在这种情况下,由于您提到您使用的是隐形标签视图。通常,选项卡视图具有一致的大小。如果您希望根据各个子视图的内容调整NSSavePanel的大小,您可能希望将它们保存为单独的视图(在相同或其他NIB文件中),并将它们作为子视图加载到NSSavePanel中。

我已成功完成此操作,其中NIB是从插件模块的磁盘列表动态加载的,其中我使用了包含弹出菜单的单个整体视图,然后使用{调整了该视图的大小{1}}以便在向其添加子视图之前更改它。然后我使用-setFrameSize:将子视图添加到现有视图中,并在更改大小并添加子视图后调用addSubview:

以下是我们现有的exportFormatOptionsView视图(包含弹出菜单)中添加了exportAccessoryViewController(这对我们来说是基于弹出菜单选择的更改)的四个片段:

[savePanel layoutIfNecessary]

当然,当您动态切换它们时,需要确保将中间视图的视图大小更改回原始大小,以便稍后添加补充视图,我这样做:< / p>

   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];

希望这有帮助。