2010-03-22 80 views
1

我有一個自定義NSView,其中包含一個子視圖 - 爲了解決這個問題,頂級視圖只是充當一個容器,並自動調整大小以適應窗口。它的子視圖從窗口邊緣繪製一個10像素的插入矩形,除了底部,它應該被窗口剪切,直到它被調整大小以顯示整個矩形。但是,它並不像我打算的那樣工作,而是在其超視圖的高度比它小的時候縮小矩形的高度。我該如何避免這種情況,並讓它保持在適當的高度,而在超視圖較小時才剪輯?自定義NSView的子視圖正在調整自己的大小,以適應其超級視圖

父視圖的實現代碼:

- (id)initWithFrame:(NSRect)frameRect { 
    self = [super initWithFrame:frameRect]; 
    if (self) { 
     subView = [[SubView alloc] initWithFrame:frameRect]; 
    } 
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor grayColor] set]; 
    [subView setFrame:NSMakeRect(10, 10, dirtyRect.size.width - 20, 500)]; 
    [self addSubview:subView]; 
} 

- (BOOL)isFlipped { 
    return YES; 
} 

而子視圖僅僅是:

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor blackColor] set]; 
    [NSBezierPath strokeRect:dirtyRect]; 
} 

- (BOOL)isFlipped { 
    return YES; 
} 

回答

2

由於ericgorr指出的那樣,autoResizingMask應採取調整大小問題的關心。

但是,我注意到你在drawRect,這是不正確的地方做你的子視圖。 drawRect是你的程序的生命週期內多次調用,但addSubview:只需要爲(只有應該來)調用一次,像這樣:

- (id)initWithFrame:(NSRect)frameRect { 
    self = [super initWithFrame:frameRect]; 
    if (self) { 
     subView = [[SubView alloc] initWithFrame:frameRect]; 
     [self addSubview:subView]; // this view now owns subView ... 
     [subView release];   // ... so we can release our copy 
    } 
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor grayColor] set]; 
    [subView setFrame:NSMakeRect(10, 10, [self bounds].size.width - 20, 500)]; 
} 

還要注意使用[self bounds],而不是dirtyRectdirtyRect是描述需要重繪的區域的矩形。這並不總是您視圖的整個邊界矩形。另一方面,[self bounds]將始終代表視圖的整個邊界,而不管哪個部分正在重繪。

+0

正如我在回答ericgorr的回答時指出的那樣,我無法使用autoResizingMask工作。關於'addSubview:'的位置和使用'[自定義]',但是,謝謝你讓我知道!這就說得通了。 – 2010-03-22 20:32:24

+0

現在我已經在subview中使用'[self bounds]'而不是'dirtyRect',它可以工作,這對您描述要重繪的區域的'dirtyRect'的解釋是有意義的。那謝謝啦! – 2010-03-22 20:37:18

+0

不客氣!很高興聽到它的工作。 – 2010-03-22 20:45:15

2

最有可能你的子視圖具有自動尺寸調整掩碼。你可以通過調用-setAutoresizingMask來清除它:使用NSViewNotSizable。

如果上海華不應該調整任何它的子視圖,你可以考慮使用-setAutoresizesSubviews:

+0

我有,唉,同時嘗試兩個superview和子視圖-setAutoresizesMask:NSViewNotSizeable,和超級視圖-setAutoresizesSubviews,無濟於事。它與我嘗試過的所有組合的行爲方式相同。 – 2010-03-22 20:29:08

相關問題