Отключить прокрутку в NSTableView

Есть ли простой способ отключить прокрутку NSTableView.

Кажется, на [myTableView enclosingScrollView] или [[myTableView enclosingScrollView] contentView] нет свойства, чтобы отключить его.


person erkanyildiz    schedule 27.09.2012    source источник


Ответы (5)


Это работает для меня: подкласс NSScrollView, настройка и переопределение через:

- (id)initWithFrame:(NSRect)frameRect; // in case you generate the scroll view manually
- (void)awakeFromNib; // in case you generate the scroll view via IB
- (void)hideScrollers; // programmatically hide the scrollers, so it works all the time
- (void)scrollWheel:(NSEvent *)theEvent; // disable scrolling

@interface MyScrollView : NSScrollView
@end

#import "MyScrollView.h"

@implementation MyScrollView

- (id)initWithFrame:(NSRect)frameRect
{
    self = [super initWithFrame:frameRect];
    if (self) {
        [self hideScrollers];
    }

    return self;
}

- (void)awakeFromNib
{
    [self hideScrollers];
}

- (void)hideScrollers
{
    // Hide the scrollers. You may want to do this if you're syncing the scrolling
    // this NSScrollView with another one.
    [self setHasHorizontalScroller:NO];
    [self setHasVerticalScroller:NO];
}

- (void)scrollWheel:(NSEvent *)theEvent
{
    // Do nothing: disable scrolling altogether
}

@end

Надеюсь, это поможет.

person titusmagnus    schedule 18.12.2012
comment
Чтобы быть более точным: NSTableView не является NSScrollView, он заключен в него. Таким образом, вам придется изменить включающий NSScrollView на этот настраиваемый класс. - person Guillaume Laurent; 31.07.2015
comment
Я проголосовал против, потому что это вызывает странное и враждебное пользователю поведение, если это дочерний элемент рабочего режима прокрутки. - person Ky Leggiero; 24.02.2018

Спасибо @titusmagnus за ответ, но я сделал одну модификацию, чтобы не прерывать прокрутку, когда "отключенный" scrollView вложен в другой scrollView: вы не можете прокручивать внешний scrollView, пока курсор находится в пределах внутреннего scrollView. Если ты сделаешь это ...

- (void)scrollWheel:(NSEvent *)theEvent
{
    [self.nextResponder scrollWheel:theEvent];
    // Do nothing: disable scrolling altogether
}

... тогда "отключенный" scrollView передаст событие прокрутки внешнему scrollView, и его прокрутка не застрянет внутри его подпредставлений.

person proxpero    schedule 09.10.2014
comment
Этот ответ предоставил то, что мне кажется наиболее практичным способом решения проблемы размещения NSTextView в прокручиваемом контейнере по умолчанию. Спасибо. - person Anton Strogonoff; 01.12.2016

Работает на меня:

- (void)scrollWheel:(NSEvent *)theEvent
{
    [super scrollWheel:theEvent];

    if ([theEvent deltaY] != 0)
    {
        [[self nextResponder] scrollWheel:theEvent];
    }
}
person Ivan Androsenko    schedule 16.08.2016

Нет простого прямого способа (это означает, что нет такого свойства, как UITableView scrollEnabled, которое вы можете установить), но я обнаружил этот ответ был полезен в прошлом.

Еще одна вещь, которую вы можете попробовать (не уверен в этом), - это создать подкласс NSTableView и переопределить -scrollWheel и -swipeWithEvent, чтобы они ничего не делали. Надеюсь это поможет

person jere    schedule 27.09.2012

person    schedule
comment
Учитывая, что вопрос помечен как цель-c, довольно любопытно, что, по вашему мнению, быстрый ответ (который, по моим крошечным быстрым знаниям, кажется не более чем портом существующих ответов цели c) является лучшим. Вам не все равно? - person mah; 23.02.2018
comment
@mah Ну, во-первых, вопрос был задан до того, как Swift стал общедоступным, поэтому я сомневаюсь, что OP действительно нуждается в ответе ObjC ???? Во-вторых, если вы прочитаете текст без кода в моем ответе, вы увидите главное преимущество. В дополнение к этому преимуществу это включает интеграцию IB. Кроме того, он объединяет идеи из нескольких других ответов в один. - person Ky Leggiero; 24.02.2018
comment
Что ж, если оператор не переместил свою кодовую базу с ObjC на swift, я бы не ожидал, что их потребности изменились;) Но добавление IB - это круто (и то, что я не понял до вашего комментария - например, я упомянул, мои быстрые знания крошечные.). Спасибо! - person mah; 24.02.2018
comment
В этом вся прелесть Свифта. Просто поместите это в Xcode и скажите ему создать заголовок моста ... и все готово. Я начал писать версию Objective-C (она закомментирована в источнике, если хотите посмотреть), но остановился, как только понял, что мне придется переопределить конструкторы только для того, чтобы предоставить значение true по умолчанию для isEnabled. В любом случае, это можно использовать и в ObjC без изменений! : D - person Ky Leggiero; 24.02.2018