2012-03-03 54 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; 

希望這個幫助。