2012-09-13 33 views
2

我的應用程序通過NSWindowController從XIB文件中加載窗口和按鈕。在-windowDidLoad中,我基於窗口的大小以編程方式設置按鈕的框架,根據哪些按鈕可見,窗口的大小可以變化。在XIB中爲這些按鈕適當地設置了自動調整掩碼。問題是,當窗口實際出現時,按鈕顯示爲沒有應用自動調整。通過非Set-SetFrame設置的NSView框架:自動調整後

在調試這個問題時,我調用NSButton並覆蓋-setFrame:在調用super的-setFrame:之後打印幀([self frame])。使用它,我觀察到框架被設置了兩次:第一次是我的編程佈局代碼(調用此框架A),後來一旦Cocoa根據用戶首選項調整窗口大小(應用自動調整掩碼,將框架設置爲B)。這些幀都看起來正確。

但是,當窗口出現時,彷彿後面的-setFrame:調用沒有持久的效果 - 按鈕的框架現在回到A.這通過打破調試器並打印框架來驗證 - 自動調整框架更新已被恢復,但-setFrame:從未再次被調用。

任何想法爲什麼我可能會看到這種行爲?

回答

0

superview正在setFrameSize:大小但更多的時候它最初發生時會發生superviewlayoutSubtreeIfNeeded方法被調用,這反過來又調用視圖的resizeWithOldSuperviewSize:。您可以通過繼承的NSView,你的情況NSButton與像

- (void)resizeWithOldSuperviewSize:(NSSize)oldSize {} 

一個空的方法來覆蓋這一點,和壓倒一切的resizeWithOldSuperviewSize:但是,你也可以更優雅的,說明你不希望你的NSView解決問題由自動佈局系統調整大小。你可以這樣做:

[<id> setAutoresizingMask:NSViewNotSizable]; 
[<id> setTranslatesAutoresizingMaskIntoConstraints:YES]; 

其中<id>將是你NSView的實例,所以也許如果你有一個出口

@property (weak) IBOutlet NSButton *myButton; 

,那麼你會設置之後

[self.myButton setAutoresizingMask:NSViewNotSizable]; 
[self.myButton setTranslatesAutoresizingMaskIntoConstraints:YES]; 

用你想要的框架呼叫setFrame:。第一行指出視圖不是很大,而第二行指出掩碼應該被自動佈局系統視爲約束。希望有所幫助!

編輯: 對不起,由於某種原因,我看了你的問題,因爲什麼,我的建議,即自動佈局覆蓋更改相反。但是,你想知道相反的情況。如果你正在使用setAutoresizingMask:你試過setTranslatesAutoresizingMaskIntoConstraints:YES?如果您可以發佈一個最簡單的工作示例,這也會很有幫助。