17

我有一个自定义视图NSView,我想禁用用户交互,但我不确定如何执行此操作。

我的想法是:

[myView setEnabled:NO];

但这是错误的并且不起作用。我怎样才能做到这一点,它只对用户可见,而没有别的?

4

5 回答 5

12

NSView 没有 setEnabled: 或 setIgnoresMouseEvents:

实现返回hitTest:方法nil

于 2013-11-08T14:39:43.180 回答
3

子类化NSView并添加以下方法

-(void)mouseDown:(NSEvent *)theEvent
{

}
于 2014-02-12T09:02:46.217 回答
3

这里

//
//  NSView-DisableSubsAdditions.m
//  Can Combine Icons
//
//  Created by David Remahl on Tue Dec 25 2001.
//  Copyright (c) 2001 Infinity-to-the-Power-of-Infinity. All rights reserved.
//

#import "NSView-DisableSubsAdditions.h"

@implementation NSView(DisableSubsAdditions)

- (void)disableSubViews
{
    [self setSubViewsEnabled:NO];
}

- (void)enableSubViews
{
    [self setSubViewsEnabled:YES];
}

- (void)setSubViewsEnabled:(BOOL)enabled
{
    NSView* currentView = NULL;
    NSEnumerator* viewEnumerator = [[self subviews] objectEnumerator];

    while( currentView = [viewEnumerator nextObject] )
    {
        if( [currentView respondsToSelector:@selector(setEnabled:)] )
        {
            [(NSControl*)currentView setEnabled:enabled];
        }
        [currentView setSubViewsEnabled:enabled];

        [currentView display];
    }
}

@end
于 2012-07-31T13:07:22.533 回答
1

这是 Swift 4 中的一个示例。将您的视图放入此自定义视图中。

class UserInterectionDisabledView: NSView {
    override func hitTest(_ point: NSPoint) -> NSView? {
        return nil
    }
}
于 2019-03-14T00:29:04.753 回答
0

我认为覆盖hitTest(_:)并不理想,因为它可以阻止其背后的所有交互。

一个更好的方法是让视图拒绝becomeFirstResponder。这样事件就可以发送到下一个响应者,基本上它会跳过视图。

class SubclassNSView: NSView {

  public var isUserInteractionEnabled: Bool = true

  open override func becomeFirstResponder() -> Bool {
    if isUserInteractionEnabled == false {
      return false
    } else {
      return super.becomeFirstResponder()
    }
  }
}
于 2021-10-28T08:20:31.807 回答