在视图的“InitWithFrame”方法中,我正在设置一个跟踪区域,我想捕获鼠标进入/退出事件。
我的问题有两个:
这是我初始化跟踪区域的方式:
trackingArea = [[NSTrackingArea alloc] initWithRect:rect
options: (NSTrackingMouseEnteredAndExited | NSTrackingInVisibleRect | NSTrackingActiveAlways )
owner:self userInfo:nil];
[self addTrackingArea:trackingArea];
为什么会发生这种情况的任何线索?我希望只为我视图的一小部分(底部)调用鼠标进入/退出事件。
答案 0 :(得分:5)
Mike Abdullah的回答解释了第2点。
以下是关于在不使用NSTrackingInVisibleRect标志时根本没有收到事件的猜测:
您提供的变量rect
可能不在视图的坐标系中。您可以使用以下代码作为NSView子类的指定初始值设定项,以接收视图整个区域的mouseEntered:
和mouseExited:
事件:
- (id)initWithFrame:(NSRect)frame
{
if ((self = [super initWithFrame:frame]))
{
//by using [self bounds] we get our internal origin (0, 0)
NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil];
[self addTrackingArea:trackingArea];
[trackingArea release];
}
return self;
}
Apple的documentation说:
创建跟踪区域对象时, 你指定一个矩形(在视图中) 坐标系),...
答案 1 :(得分:3)
直接来自NSTrackingInVisibleRect
的文档:
NSTrackingArea
对象会自动与视图可见区域(visibleRect
)中的更改同步,并忽略从rect
返回的值。