gpt4 book ai didi

objective-c - 有什么办法解决这个 NSTrackingArea 怪癖吗?

转载 作者:太空狗 更新时间:2023-10-30 03:53:42 25 4
gpt4 key购买 nike

我这里有个问题。我正在像这样创建一个 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

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

我的问题是是否有解决此问题的方法,除非我的鼠标在窗口和弹出窗口或类似的东西之外,否则它无法关闭窗口。有办法做到这一点吗?

最佳答案

参见-[NSWindow setIgnoresMouseEvents:]。

顺便说一下,要非常小心叠加窗口。它们的困难在于,当你创建它时你必须给它绝对坐标,并且有一个小的竞争——父窗口可以在你获得它的框架的时间和你创建子窗口的时间之间移动。窗口移动由 Window Server 完成,并且可以独立于应用程序完成(这就是为什么您可以在应用程序打沙滩球时移动窗口)。现在这很少会成为问题,但是有可能并且很难正确修复它。如果您试图在父窗口调整大小时调整大小或移动子窗口,那就更成问题了。

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

关于objective-c - 有什么办法解决这个 NSTrackingArea 怪癖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com