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

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


谢谢!

最佳答案

我可以在NSTrackingArea初始化中指定自己的方法(例如“ myMethod”)吗?

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



不能。owner应该是用于接收请求的鼠标跟踪,鼠标移动或光标更新消息的对象,而不是方法。如果传入自定义方法,它甚至都不会编译。


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


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


使用addTrackingArea:方法将跟踪区域添加到要跟踪的视图中。
根据需要,可以选择在mouseEntered:类中实现mouseMoved:mouseExited:owner方法。




- (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:方法即可。

10-08 09:09