2011-02-16 163 views
0

我有一個NSTableView,創建自IB,我只想自動隱藏水平滾動條。我想這樣做的主要原因是因爲如果有垂直滾動條,NSTableView corverView只會顯示get。自動隱藏NSScrollView中只有水平滾動條

我找不到任何方法與基類做到這一點。所以我嘗試了繼承NSScrollView並觀察水平滾動條上的隱藏鍵(代碼如下)。這有效;但是,每次用戶調整窗口大小時,視圖都會嘗試重置當前的可見選項。這使我的實施有點貴;看起來不雅。有關如何做到這一點的更好的想法?

在此先感謝!

當前實現:

@interface PVScrollView : NSScrollView { 
    BOOL autohidesHorizontalScroller; 
} 

@property(assign) BOOL autohidesHorizontalScroller; 

- (void) viewResized:(NSNotification*)notification; 

@end 

@implementation PVScrollView 

@synthesize autohidesHorizontalScroller; 

- (void) setAutohidesHorizontalScroller:(BOOL)val 
{ 
    autohidesHorizontalScroller = val; 
    [self setAutohidesScrollers:NO]; 
    [[self horizontalScroller] addObserver:self 
           forKeyPath:@"hidden" 
           options:0 
           context:nil]; 

} 

- (void) observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    if (!([self documentVisibleRect].size.width < [[self documentView] frame].size.width)) 
    { 
    // remove observer 
    [[self horizontalScroller] removeObserver:self 
            forKeyPath:@"hidden"]; 
    [[self horizontalScroller] setHidden:YES]; 
    //[[self horizontalScroller] setNeedsDisplay:YES]; 
    // add it back 
    [[self horizontalScroller] addObserver:self 
           forKeyPath:@"hidden" 
            options:0 
            context:nil]; 
    } 
} 

@end 
+1

我會說,不要擔心它,直到你發現它實際上會導致性能問題。過早優化是不好的。 – 2011-02-16 09:15:08

+0

我傾向於同意Douwe,但是我想補充一點,通過使用Instruments來分析代碼,您仍然可以很容易地找到潛在的性能問題。過早優化並不總是如此。有時候分析一些東西,而在知道它可能表現不佳時進行壓力測試是唯一合乎邏輯的事情。忽略它直到它引發問題,當你知道它可能從頭開始時,比「過早」優化更不合邏輯。 :-) – 2011-02-16 16:53:04

回答

1

這給一個鏡頭在你NSScrollView子類:

- (void)setFrameSize:(NSSize)newSize; 
{ 
    NSSize minFrameSize = [NSScrollView frameSizeForContentSize:[self contentSize] hasHorizontalScroller:NO hasVerticalScroller:YES borderType:[self borderType]]; 
    BOOL wantScroller = minFrameSize.width > newSize.width; 
    [self setHasHorizontalScroller:wantScroller];   
    [super setFrameSize: newSize]; 
} 

你需要勾選「顯示垂直卷軸」,取消選中「自動隱藏滾動條」吧上班;我並沒有打擾它對IB的變化。另外,當窗口第一次顯示時(在NSScrollView構造函數中),你需要做同樣的事情。

我比較了CPU使用情況,有沒有這種改變;在我的測試應用程序中,似乎最多不超過1%(19%→20%)。