2

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

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

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

4

1 回答 1

1

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

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

在从插件模块的磁盘列表动态加载 NIB 的情况下,我已经成功地做到了这一点,我使用了一个包含弹出菜单的整体视图,然后我调整了该视图的大小,-setFrameSize:以便更改在将子视图添加到它之前。然后我曾经addSubview:将子视图添加到我现有的视图中,并[savePanel layoutIfNeeded]在更改大小并添加子视图后调用。

这是将 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;

希望这可以帮助。

于 2012-03-03T21:26:32.450 回答