Может ли NSScrollView прокручиваться, если setHasHorizontalScroller: NO?

Можно ли «скрыть» скроллеры NSScrollView и по-прежнему получать жесты прокрутки?


person NuBee    schedule 17.05.2011    source источник


Ответы (5)


Создайте подкласс NSScroller и установите его как средство вертикальной/горизонтальной прокрутки для экземпляра NSScrollView.

Подкласс NSScroller должен переопределить это (10.7 и выше):

+ (CGFloat)scrollerWidthForControlSize:(NSControlSize)controlSize scrollerStyle:(NSScrollerStyle)scrollerStyle {
return 0;
}
person YoonHo    schedule 03.10.2012

Это определенно ошибка в AppKit. Мне удалось заставить это работать на 10.8.5, используя одно из следующих решений:

1) Подкласс NSScroller (предпочтительный метод)

+ (BOOL)isCompatibleWithOverlayScrollers
{
    // Let this scroller sit on top of the content view, rather than next to it.
    return YES;
}

- (void)setHidden:(BOOL)flag
{
    // Ugly hack: make sure we are always hidden.
    [super setHidden:YES];
}

Источник: jmk в https://stackoverflow.com/a/12960795/836263

2) Отскок и импульс кажутся нарушенными при использовании устаревшего стиля. Это также частично нарушает синхронизацию прокрутки код. Это приводит к тому, что представления прокрутки сбрасывают положение прокрутки, если одно NSScrollerStyleOverlay, а другое NSScrollerStyleLegacy. Если вид прокрутки в стиле наложения прокручивается, а затем прокручивается устаревший стиль, он сбрасывает оба представления прокрутки до верхнего смещения прокрутки y = 0.

[self.scrollView setHasVerticalScroller:YES];
[self.scrollView setScrollerStyle:NSScrollerStyleLegacy];
[self.scrollView setHasVerticalScroller:NO];
person Andrew    schedule 28.09.2013

Заставляет вид прокрутки не отображать скроллер и не реагировать на жестовую прокрутку:

-setHasHorizontalScroller:NO

Отображает отключенный скроллер, но он реагирует на жестовую прокрутку:

-setHasHorizontalScroller:YES
-setHidden:YES
person nubee    schedule 22.07.2011
comment
Я думаю, может быть, вы имеете в виду, что ДА приводит к тому, что отключенная прокрутка НЕ отображается, но она реагирует на жестовую прокрутку, нет? - person Alex Gray; 21.04.2012

Да, это возможно. Попробуйте это вскоре после инициализации scrollView.

    self.scrollView.wantsLayer = YES;

Я заставил это работать, не скрывая подкласс NSScroller и не касаясь setHasVerticalScroller:. Кроме того, если self.scrollView является подклассом, переопределяющим drawRect:, попробуйте отключить его, чтобы убедиться, что то, что вы там делаете, не вызывает проблемы.

person proxpero    schedule 08.07.2014

Почему бы тебе просто не попробовать?

Чтобы ответить на вопрос: да, если у пользователя есть мышь с колесиком прокрутки или сенсорная панель с возможностью прокрутки, все равно можно прокручивать представление, несмотря на то, что скроллеры невидимы.

person omz    schedule 17.05.2011
comment
Не уверен, что я делаю неправильно. Я могу прокручивать трекпадом, когда setHasHorizontalScroller:YES, но не могу, если setHasHorizontalScroller:NO. - person NuBee; 17.05.2011