有没有一种简单的方法来禁用 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)
}
}
}
只需将 any 替换NSScrollView
为DisablableScrollView
(或者BCLDisablableScrollView
如果您仍然使用 ObjC),您就完成了。只需isEnabled
在代码或 IB 中设置,它就会按预期工作。
这样做的主要优点是嵌套滚动视图;在不将事件发送给下一个响应者的情况下禁用子级也会在光标位于禁用的子级上时有效地禁用父级。
以下列出了这种方法的所有优点:
NSScrollView
感谢@titusmagnus 的回答,但我做了一个修改,以免在“禁用”滚动视图嵌套在另一个滚动视图中时中断滚动:当光标位于内部边界内时,您无法滚动外部滚动视图滚动视图。如果你这样做...
- (void)scrollWheel:(NSEvent *)theEvent
{
[self.nextResponder scrollWheel:theEvent];
// Do nothing: disable scrolling altogether
}
...然后“禁用”的滚动视图会将滚动事件向上传递到外部滚动视图,并且它的滚动不会卡在其子视图内。
为我工作:
- (void)scrollWheel:(NSEvent *)theEvent
{
[super scrollWheel:theEvent];
if ([theEvent deltaY] != 0)
{
[[self nextResponder] scrollWheel:theEvent];
}
}
没有简单的直接方法(意思是,没有scrollEnabled
可以设置的 UITableView 之类的属性),但我发现这个答案在过去很有帮助。
您可以尝试的另一件事(不确定)是子类化NSTableView
和覆盖-scrollWheel
,-swipeWithEvent
因此它们什么都不做。希望这可以帮助