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.
原因如下:一旦窗口打开,跟踪区域就会认为我的鼠标不再在窗口上方,因为弹出窗口就在它前面.但是,一旦它删除弹出窗口,它就会认为我的鼠标再次覆盖它,从而再次创建并显示弹出窗口.因此,这是一个无限循环.
我的问题是,如果有解决的办法,在那里,除非我的鼠标是外面不能关闭窗口都的窗口和弹出窗口或类似的东西.有没有办法做到这一点?
请参阅-[NSWindow setIgnoresMouseEvents:]。
\n\n顺便说一句,使用覆盖窗口时要非常小心。它们的困难在于,你必须在创建它时给它绝对坐标,并且\xe2\x80\x99s有一个小竞赛\xe2\x80\x94,父窗口可以在你获取其框架的时间和创建子窗口的时间。窗口移动由 Window Server 完成,并且可以独立于应用程序完成(这就是为什么您可以在应用程序进行沙滩球运动时移动窗口)。现在,\xe2\x80\x99 很少会成为一个问题,但有可能并且很难正确修复它。如果您在父窗口调整大小时尝试调整或移动子窗口的大小,则问题更大。
\n\n现在我意识到这些都可能不适用于您,但如果适用,并且您可以想到使用子窗口的替代方法,我建议您使用它。
\n