NSTableView のスクロールを無効にする簡単な方法はありますか。
[myTableView enclosingScrollView]
オンまたは[[myTableView enclosingScrollView] contentView]
無効にするプロパティがないよう
です。
NSTableView のスクロールを無効にする簡単な方法はありますか。
[myTableView enclosingScrollView]
オンまたは[[myTableView enclosingScrollView] contentView]
無効にするプロパティがないよう
です。
これは私にとってはうまくいきます: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
これが役立つことを願っています。
私の意見では、これが最善の解決策です。
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
anyをDisablableScrollView
(またはBCLDisablableScrollView
まだ ObjC を使用している場合) に置き換えるだけで完了です。isEnabled
コードまたは IB で設定するだけで、期待どおりに動作します。
これが持つ主な利点は、ネストされたスクロール ビューです。イベントを次のレスポンダーに送信せずに子を無効にすると、カーソルが無効な子の上にある間、親も効果的に無効になります。
このアプローチのすべての利点を次に示します。
NSScrollView
答えてくれた@titusmagnusに感謝しますが、「無効な」scrollViewが別のscrollView内にネストされているときにスクロールを中断しないように、1つの変更を加えました。カーソルが内側の境界内にある間、外側のscrollViewをスクロールすることはできませんscrollView. こうすれば…
- (void)scrollWheel:(NSEvent *)theEvent
{
[self.nextResponder scrollWheel:theEvent];
// Do nothing: disable scrolling altogether
}
...その後、「無効な」scrollViewはスクロールイベントを外側のscrollViewに渡し、そのスクロールはサブビュー内で動かなくなります。
私のために働く:
- (void)scrollWheel:(NSEvent *)theEvent
{
[super scrollWheel:theEvent];
if ([theEvent deltaY] != 0)
{
[[self nextResponder] scrollWheel:theEvent];
}
}
単純な直接的な方法はありません (つまり、scrollEnabled
設定できる UITableView のようなプロパティはありません) が、この回答は過去に役に立ちました。
あなたが試すことができるもう1つのこと(これについてはわかりません)は、サブクラス化NSTableView
とオーバーライド-scrollWheel
で-swipeWithEvent
あるため、何もしません。お役に立てれば