2012-03-03 47 views
1

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

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

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

+0

这听起来像你是在代码而不是xib文件中创建accessoryView。如果是这样,你可以尝试xib文件方法。此外,你是什么意思“使用其分配的菜单作为模板”? – 2012-03-03 06:48:15

+0

不,accessoryView在我的主要xib文件中。至于第二位,NSSearchFields使用您提供的NSMenu作为模板,然后在运行时使用它的副本,这意味着需要修改副本而不是原始副本。 – 2012-03-03 14:41:08

+0

好吧,但那么你为什么需要在代码中执行-setFrameSize?这不是已经安装在xib中吗? – 2012-03-03 17:12:46

回答

1

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

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

我已经成功地完成了这种情况,其中NIB从插件模块的磁盘列表中动态加载,其中我使用了包含弹出式菜单的单个总体视图,然后使用该视图调整了大小-setFrameSize:为了在添加子视图之前对其进行更改。然后我使用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; 

希望这个帮助。

相关问题