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


NSScrollViewanyをDisablableScrollView(またはBCLDisablableScrollViewまだ ObjC を使用している場合) に置き換えるだけで完了です。isEnabledコードまたは IB で設定するだけで、期待どおりに動作します。

これが持つ主な利点は、ネストされたスクロール ビューです。イベントを次のレスポンダーに送信せずに子を無効にすると、カーソルが無効な子の上にある間、親も効果的に無効になります。

このアプローチのすべての利点を次に示します。

  • ✅ スクロールを無効にする
    • ✅ プログラムで実行し、デフォルトで正常に動作します
  • ✅ 親ビューのスクロールを中断しません
  • ✅ Interface Builder の統合
  • ✅ ドロップイン交換NSScrollView
  • ✅ Swift および Objective-C との互換性
于 2018-02-22T19:19:48.057 に答える
9

答えてくれた@titusmagnusに感謝しますが、「無効な」scrollViewが別のscrollView内にネストされているときにスクロールを中断しないように、1つの変更を加えました。カーソルが内側の境界内にある間、外側のscrollViewをスクロールすることはできませんscrollView. こうすれば…

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

...その後、「無効な」scrollViewはスクロールイベントを外側のscrollViewに渡し、そのスクロールはサブビュー内で動かなくなります。

于 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 のようなプロパティはありません) が、この回答は過去に役に立ちました。

あなたが試すことができるもう1つのこと(これについてはわかりません)は、サブクラス化NSTableViewとオーバーライド-scrollWheel-swipeWithEventあるため、何もしません。お役に立てれば

于 2012-09-27T17:18:09.213 に答える