11

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

似乎没有任何属性 [myTableView enclosingScrollView][[myTableView enclosingScrollView] contentView]禁用它。

4

5 回答 5

20

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

我希望这有帮助。

于 2012-12-18T19:57:19.037 回答
17

这是我认为最好的解决方案:

斯威夫特 5

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


只需将 any 替换NSScrollViewDisablableScrollView(或者BCLDisablableScrollView如果您仍然使用 ObjC),您就完成了。只需isEnabled在代码或 IB 中设置,它就会按预期工作。

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

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

  • ✅ 禁用滚动
    • ✅ 以编程方式执行,默认行为正常
  • ✅ 不中断滚动父视图
  • ✅ 界面生成器集成
  • ✅ 直接替换NSScrollView
  • ✅ Swift 和 Objective-C 兼容
于 2018-02-22T19:19:48.057 回答
9

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

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

...然后“禁用”的滚动视图会将滚动事件向上传递到外部滚动视图,并且它的滚动不会卡在其子视图内。

于 2014-10-09T20:09:43.583 回答
2

为我工作:

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

    if ([theEvent deltaY] != 0)
    {
        [[self nextResponder] scrollWheel:theEvent];
    }
}
于 2016-08-16T06:08:43.537 回答
1

没有简单的直接方法(意思是,没有scrollEnabled可以设置的 UITableView 之类的属性),但我发现这个答案在过去很有帮助。

您可以尝试的另一件事(不确定)是子类化NSTableView和覆盖-scrollWheel-swipeWithEvent因此它们什么都不做。希望这可以帮助

于 2012-09-27T17:18:09.213 回答