我有一个NSSavePanel设置,带有一个附件视图,该附件视图包含一个格式弹出菜单和一个表格选项卡视图,其中包含有关所选格式的各种选项。它可以正确显示在面板上,但是我似乎无法调整其大小。
在accessoryView上调用-setFrameSize会导致一次且不正确的调整大小,然后对任何后续调用均无响应。视图中的其他控件完全拒绝响应任何调用。
NSSavePanel是否像仅将其分配的菜单用作模板的NSSearchField一样工作?如果是这样,如何在当前活动的保存面板中操纵附件视图的特定实例?
最佳答案
我的经验(尤其是必须在10.5上运行的代码)的经验是,为了处理NSSavePanel的附件视图中的排列大小,我们必须删除(将其设置为nil)并重新添加它。在10.7(我相信是10.6)之下,更改frameSize后调用[savePanel layoutIfNecessary]
似乎足够了。
在这种情况下,由于您提到您正在使用不可见的选项卡视图。通常,选项卡视图具有一致的大小。如果要根据各个子视图的内容调整NSSavePanel的大小,则可能需要将其保留为单独的视图(在相同或其他NIB文件中),并将其作为子视图加载到NSSavePanel中。
在从插件模块的磁盘列表中动态加载NIB的情况下,我已经成功完成了此操作,在该情况下,我使用了一个包含弹出菜单的整体视图,然后使用-setFrameSize:
在在添加子视图之前对其进行更改。然后,我使用addSubview:
将子视图添加到我现有的视图中,并在更改大小和添加子视图后调用了[savePanel layoutIfNecessary]
。
这是向现有的exportFormatOptionsView视图(包含弹出菜单)中添加exportAccessoryViewController(这对我们来说是根据弹出菜单的选择而更改的内容)的四个片段:
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;
希望这可以帮助。