0

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
4

1 に答える 1

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%)変動するようです。

于 2011-02-19T04:34:47.643 に答える