我的经验已经(特别是对于必须运行在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;
希望这个帮助。
这听起来像你是在代码而不是xib文件中创建accessoryView。如果是这样,你可以尝试xib文件方法。此外,你是什么意思“使用其分配的菜单作为模板”? – 2012-03-03 06:48:15
不,accessoryView在我的主要xib文件中。至于第二位,NSSearchFields使用您提供的NSMenu作为模板,然后在运行时使用它的副本,这意味着需要修改副本而不是原始副本。 – 2012-03-03 14:41:08
好吧,但那么你为什么需要在代码中执行-setFrameSize?这不是已经安装在xib中吗? – 2012-03-03 17:12:46