在NSTableView中禁用滚动

时间:2012-09-27 16:48:15

标签: objective-c macos scroll nstableview nsscrollview

是否有一种简单的方法可以禁用NSTableView的滚动。

似乎没有任何财产 <{1}}或[myTableView enclosingScrollView]禁用它。

4 个答案:

答案 0 :(得分:16)

这对我有用:子类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

我希望这会有所帮助。

答案 1 :(得分:9)

感谢@titusmagnus的回答,但我做了一个修改,以便在&#34;禁用&#34; scrollView嵌套在另一个scrollView中:当光标位于内部scrollView的边界内时,您无法滚动外部scrollView。如果你这样做......

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

...然后&#34;禁用&#34; scrollView将滚动事件传递到外部scrollView,它的滚动不会卡在其子视图中。

答案 2 :(得分:6)

在我看来,这是最好的解决方案:

Swift 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)
        }
    }
}

<小时/>

只需将NSScrollView替换为DisablableScrollView(或BCLDisablableScrollView,如果您仍然使用ObjC)并且您已完成。只需在代码或IB中设置isEnabled,它就会按预期工作。

这样做的主要优点是嵌套滚动视图;在没有将事件发送给下一个响应者的情况下禁用子项也将在光标位于禁用的子项上时有效地禁用父项。

以下列出了这种方法的所有优点:

  • ✅禁用滚动
    • ✅以编程方式执行,默认情况下正常运行
  • ✅不会中断滚动父视图
  • ✅InterfaceBuilder集成
  • NSScrollView
  • 的替代品
  • ✅Swift和Objective-C兼容

答案 3 :(得分:2)

没有简单的直接方法(意思是,没有像你可以设置的UITableView scrollEnabled这样的属性),但我发现this answer过去很有帮助。

您可以尝试的另一件事(不确定这一点)是继承NSTableView并覆盖-scrollWheel-swipeWithEvent,因此他们什么都不做。希望这有帮助