任何方式围绕这个NSTrackingArea怪癖?

时间:2011-02-25 04:56:57

标签: objective-c cocoa macos

我在这里遇到了问题。我正在创建这样的NSTrackingArea

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self frame] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil];
[self addTrackingArea:area];
[area release];

这很好用。但是,这是一个问题。我把它设置成这样:

-(void)mouseEntered:(NSEvent *)event {
    [self toggleDetail];
}
-(void)mouseExited:(NSEvent *)event {
    [self toggleDetail];
}

toggleDetail基本上是这样的:

- (void)toggleDetail {
if (!attachedWindow) {
    NSPoint buttonPoint = NSMakePoint(NSMidX([conditionImage frame]),
                                      NSMidY([conditionImage frame]));
    attachedWindow = [[MAAttachedWindow alloc] initWithView:view 
                                            attachedToPoint:buttonPoint 
                                                   inWindow:[self window] 
                                                     onSide:12
                                                 atDistance:10.0];
    //config removed because of irrelevance
    [[self window] addChildWindow:attachedWindow ordered:NSWindowAbove];
} else {
    [[self window] removeChildWindow:attachedWindow];
    [attachedWindow orderOut:self];
    [attachedWindow release];
    attachedWindow = nil;
}

}

现在这是我的问题。当我的MAAttachedWindow关闭,我将鼠标移到窗口上时,它会打开。花花公子。但是,当我将鼠标远离MAAttachedWindow时,这是唯一的好处。只要我将鼠标移到它上面(同时仍然在主窗口上方),它就会开始猛烈地打开并关闭MAAttachedWindow

原因如下:一旦窗口打开,跟踪区域就会认为我的鼠标不再在窗口上方,因为弹出窗口就在它前面。但是,一旦它删除弹出窗口,它就会认为我的鼠标再次覆盖它,从而再次创建并显示弹出窗口。因此,这是一个无限循环。

我的问题是,如果有办法解决这个问题,除非我的鼠标在两个窗口和弹出窗口之外,否则它无法关闭窗口。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

参见 - [NSWindow setIgnoresMouseEvents:]。

顺便说一下,要非常小心覆盖窗口。它们的难点在于,在创建它时必须给它绝对坐标并且有一个小的竞争 - 父窗口可以在你获得它的帧和创建子窗口的时间之间移动。窗口移动由窗口服务器完成,可以独立于应用程序完成(这就是为什么你可以在应用程序进行沙滩球时移动窗口)。现在很少见这是一个问题,但是有可能并且很难正确地修复它。如果您在父窗口调整大小时尝试调整大小或移动子窗口,则会出现问题。

现在我意识到这一切都不适用于你,但如果确实如此,你可以想到使用子窗口的另一种选择,我会建议你继续使用它。