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

sud*_*-rf 6 macos cocoa objective-c

我在这里遇到了问题.我正在创建一个NSTrackingArea这样的:

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self frame] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil];
[self addTrackingArea:area];
[area release];
Run Code Online (Sandbox Code Playgroud)

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

-(void)mouseEntered:(NSEvent *)event {
    [self toggleDetail];
}
-(void)mouseExited:(NSEvent *)event {
    [self toggleDetail];
}
Run Code Online (Sandbox Code Playgroud)

而且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;
}
Run Code Online (Sandbox Code Playgroud)

}

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

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

我的问题是,如果有解决的办法,在那里,除非我的鼠标是外面不能关闭窗口的窗口和弹出窗口或类似的东西.有没有办法做到这一点?

Chr*_*ter 3

请参阅-[NSWindow setIgnoresMouseEvents:]。

\n\n

顺便说一句,使用覆盖窗口时要非常小心。它们的困难在于,你必须在创建它时给它绝对坐标,并且\xe2\x80\x99s有一个小竞赛\xe2\x80\x94,父窗口可以在你获取其框架的时间和创建子窗口的时间。窗口移动由 Window Server 完成,并且可以独立于应用程序完成(这就是为什么您可以在应用程序进行沙滩球运动时移动窗口)。现在,\xe2\x80\x99 很少会成为一个问题,但有可能并且很难正确修复它。如果您在父窗口调整大小时尝试调整或移动子窗口的大小,则问题更大。

\n\n

现在我意识到这些都可能不适用于您,但如果适用,并且您可以想到使用子窗口的替代方法,我建议您使用它。

\n