только скрыть горизонтальный скроллер в NSScrollView - PullRequest
0 голосов
/ 16 февраля 2011

У меня есть NSTableView, созданный из IB, который я хочу только автоматически скрывать горизонтальный скроллер.Основная причина, по которой я хочу это сделать, заключается в том, что 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 Ответ

1 голос
/ 19 февраля 2011

Сделайте это в своем подклассе 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).

Я сравнил использование процессора с этим изменением и без него; в моем тестовом приложении оно может составлять максимум 1% (19% → 20%).

...