2009-07-14 72 views
3

我偶爾想改變一個NSView的維度programmaticaly。要做到這一點,獲取各種視圖的尺寸,相對於彼此進行調整,然後使用setFrame:來重新定位是很有幫助的。爲什麼NSView的框架方法返回錯誤的結果?

問題是,框架方法通常返回明顯錯誤的NSRects,從我的角度來看。

我有一個NSPanel在Interface Builder中建立的程序,以及到我的主程序的各種連接。爲了測試框架返回的NSRects,我在應用程序的awakeFromNib:方法中打開了面板,檢索了一些NSRects,並將它們打印到控制檯。

這是我awakeFromNib:

- (void)awakeFromNib { 
    NSLog(@"in awakeFromNib"); 
    [self showPrefsSheet:self]; //this is the prefs sheet with the controls of interest 
           //note that it does indeed pop up and is displayed 
    originalFrame = [aTextView frame]; 
    NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height); 
    originalFrame = [aButton frame]; 
    NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height); 
    return; 
    } 

這段代碼的結果是這樣的控制檯:

in awakeFromNib 
the frame is 0, 0, 0, 0 
the frame is 0, 1079230464, 0, 1078329344 

注意,(我)面板與兩個控件都顯示在屏幕上; (ii)我知道這樣一個事實,即網點連接正確,因爲我可以通過程序對事件進行控制並讓它們工作。 (iii)界面生成器在「尺寸&位置」下的檢查器中顯示正確的框架尺寸。

簡而言之,關於該程序的其他一切都是完美的。它實際上似乎沒有設置框架尺寸或其他東西。

有人可以告訴我如何檢索真實的幀信息?或者至少解釋我看到的結果?

回答

9

幀座標是浮點數,但是日誌消息正在使用%d。 (整數)。

變化的NSLog字符串:

@"the frame is %f, %f, %f, %f" 

編輯:

這裏是一個非常有用的宏調試rects當我使用:

#define RECTLOG(rect) (NSLog(@"" #rect @" x:%f y:%f w:%f h:%f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)); 

然後,您可以做一些簡單的矩形日誌:

RECTLOG([aTextView frame]); 
+0

男孩,是我的臉紅! 謝謝,凱洛阿。我覺得很愚蠢,但我很高興能夠把它放在我身後。 – Dennis 2009-07-14 19:48:24

+0

沒問題。我將添加一個非常有用的宏。 – amattn 2009-07-14 19:51:13

4

記錄NSRect時,請記住這些字段是浮點值,而不是整數。

不用編寫的格式說明自己(無論在線或通過宏),使用該框架爲您提供的功能:

NSLog(@"frame - %@", NSStringFromRect([view frame])); 

參見:

NSStringFromSize 
NSStringFromPoint 
NSStringFromRange 

相關問題