Objective c 有没有办法绕过这个怪癖?
我这里有个问题。我正在创建一个Objective c 有没有办法绕过这个怪癖?,objective-c,cocoa,macos,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)
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];
}
- (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;
}
这个很好用。然而,这里有一个问题。我把它设置成这样:
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];
}
- (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;
}
而toggleDetail
基本上是这样的:
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];
}
- (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;
}
}
现在我的问题来了。当myMAAttachedWindow
关闭时,我将鼠标移到窗口上,窗口将打开。花花公子然而,只有当我让鼠标远离MAAttachedWindow
时,它才有好处。当我将鼠标移到它上面时(仍在主窗口上方),它就开始猛烈地打开和关闭MAAttachedWindow
原因如下:一旦窗口打开,跟踪区域就会认为我的鼠标不再在窗口上方,因为弹出窗口就在它前面。然而,一旦它删除了弹出窗口,它就会认为我的鼠标又在它上面,从而再次创建和显示弹出窗口。因此,这是一个无止境的循环
我的问题是,如果有办法,它不能关闭窗口,除非我的鼠标在窗口和弹出窗口或类似的东西外面。有没有办法做到这一点?请参见-[NSWindow setIgnoresMouseEvents:] 顺便说一句,使用重叠窗口时要非常小心。它们的困难在于,在创建它时,必须给它绝对坐标,并且存在一个小的竞争,父窗口可以在获得帧的时间和创建子窗口的时间之间移动。窗口移动是由窗口服务器完成的,并且可以独立于应用程序来完成(这就是为什么当应用程序在海滩上打球时可以移动窗口)。现在这是一个非常罕见的问题,但它是可能的,而且很难妥善解决它。如果在父窗口调整大小时尝试调整或移动子窗口,则问题更大
现在我意识到这些都不适用于您,但如果确实适用,并且您可以考虑使用子窗口的替代方案,我建议您使用它。为什么只有在鼠标处于特定位置(跟踪区域为矩形)时才显示窗口?每次鼠标进入跟踪区域时,我都会说切换窗口状态。@Eimantas,因为弹出窗口更像是一个悬停和获取信息弹出窗口,而不是与之交互的窗口。然后我建议将其显示在跟踪区域的某个侧面。不在上面,否则光标会阻止信息窗口上的一些信息。@Eimantas:是的,我可以,但这不是我希望的解决方案。那么基本上可以确定事件来自哪个窗口吗?还没有尝试过,但看起来很完美!也谢谢你的警告。我会记在心里的。好吧,我得试试它,除了一件事之外,它工作得很好。如果我把鼠标移到窗口上,弹出窗口就会出现,然后我把鼠标移到弹出窗口上,它就不再做那种奇怪的抽搐了。但是,如果我将鼠标移到弹出窗口所在区域的窗口上,它仍然存在相同的问题。你知道为什么鼠标进入窗口会有不同吗?谢谢你的帮助!何时执行-[NSWindow setIgnoresMouseEvents:]调用?确保它在窗口可见之前。您可能会发现,您必须等到窗口服务器创建好窗口后,才能使其可见(这可能有点尴尬)。