2011-02-16 106 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%)。