禁用NSTableView的滚动(Disable scrolling in NSTableView)

2019-08-01 00:41发布

有没有一种简单的方法来禁用一个NSTableView的滚动。

似乎没有任何财产[myTableView enclosingScrollView][[myTableView enclosingScrollView] contentView]禁用它。

Answer 1:

这个工作对我来说:子类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

我希望这有帮助。



Answer 2:

由于@titusmagnus的答案,但我做了一个修改,以免打破“已禁用”滚动视图嵌套在另一个滚动视图中时,当滚动:不能滚动滚动视图外当光标内的范围内滚动视图。 如果你这样做......

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

......那么“禁用”滚动视图将通过滚动事件到外滚动视图和其滚动不会得到它的子视图里陷了下去。



Answer 3:

下面是我认为最好的解决办法:

斯威夫特4

import Cocoa

@IBDesignable
@objc(BCLDisablableScrollView)
public class DisablableScrollView: NSScrollView {
    @IBInspectable
    @objc(enabled)
    public var isEnabled: Bool = true

    public override func scrollWheel(with event: NSEvent) {
        if isEnabled {
            super.scrollWheel(with: event)
        }
        else {
            nextResponder?.scrollWheel(with: event)
        }
    }
}


只需更换任何NSScrollViewDisablableScrollView (或BCLDisablableScrollView如果你仍在使用ObjC),你就大功告成了。 只需设置isEnabled代码或IB和预期它会奏效。

这具有的主要优势是嵌套的滚动视图; 禁止孩子不发送事件到下一个响应者也将有效地禁止父母当光标在残疾儿童。

下面是这种方法列出来的所有优点:

  • ✅禁用滚动
    • ✅这样做编程,默认行为正常
  • ✅不中断滚动父视图
  • ✅Interface Builder的整合
  • ✅投递替代NSScrollView
  • ✅夫特和Objective-C兼容


Answer 4:

有没有简单直接的方法(这意味着,有喜欢的UITableView的无属性scrollEnabled ,您可以设置),但我发现这个答案在过去的帮助。

还有一两件事你可以尝试(不知道这个)是继承NSTableView ,并覆盖-scrollWheel-swipeWithEvent让他们一筹莫展。 希望这可以帮助



Answer 5:

对我的作品:

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

    if ([theEvent deltaY] != 0)
    {
        [[self nextResponder] scrollWheel:theEvent];
    }
}


文章来源: Disable scrolling in NSTableView