NSTrackingArea调用自定义代码

时间:2015-05-17 17:35:59

标签: macos cocoa nstrackingarea

当NSTrackingArea定义的区域捕获鼠标事件时,如何调用自己的方法?我可以在NSTrackingArea init中指定我自己的方法(例如“myMethod”),如下所示吗?

trackingAreaTop = [[NSTrackingArea alloc] initWithRect:NSMakeRect(0,0,100,100) options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveAlways) owner:myMethod userInfo:nil];

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我可以在NSTrackingArea init中指定我自己的方法(例如" myMethod"),如下所示?

trackingAreaTop = [[NSTrackingArea alloc] initWithRect:NSMakeRect(0,0,100,100) options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveAlways) owner:myMethod userInfo:nil];

没有。 owner应该是接收请求的鼠标跟踪,鼠标移动或游标更新消息的对象,而不是方法。如果你传递自定义方法,它甚至不会编译。

  

当NSTrackingArea定义的区域捕获鼠标事件时,如何调用我自己的方法?

NSTrackingArea仅定义对鼠标移动敏感的区域。为了回应它们,您需要:

  1. 使用addTrackingArea:方法将跟踪区域添加到要跟踪的视图。
  2. 根据需要,可以选择在mouseEntered:课程中实施mouseMoved:mouseExited:owner方法。
  3. - (id)initWithFrame:(NSRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
            NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:frame options:NSTrackingMouseEnteredAndExited owner:self userInfo:nil];
            [self addTrackingArea:trackingArea];
        }
    
        return self;
    }    
    
    - (void)mouseEntered:(NSEvent *)theEvent {
        NSPoint mousePoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
        // do what you desire
    }
    

    有关详细信息,请参阅Using Tracking-Area Objects

    另外,如果您想要响应鼠标单击事件而不是鼠标移动事件,则无需使用NSTrackingArea。请继续执行mouseDown:mouseUp:方法。