在NSScrollView中仅自动隐藏水平滚动条

时间:2011-02-16 08:36:25

标签: objective-c cocoa macos nsscrollview

我有一个从IB创建的NSTableView,我只想自动隐藏水平滚动条。我想要这样做的主要原因是因为如果有一个垂直滚动条,似乎只显示NSTableView corverView。

我找不到任何使用基类执行此操作的方法。所以我尝试了子类化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 个答案:

答案 0 :(得分: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%)。