【发布时间】:2012-02-17 06:36:07
【问题描述】:
为什么鼠标通过滚动或做动画退出 NStrackingArea 时没有调用 mouseExited/mouseEntered?
我创建这样的代码:
鼠标进入和退出:
-(void)mouseEntered:(NSEvent *)theEvent {
NSLog(@"Mouse entered");
}
-(void)mouseExited:(NSEvent *)theEvent
{
NSLog(@"Mouse exited");
}
追踪区域:
-(void)updateTrackingAreas
{
if(trackingArea != nil) {
[self removeTrackingArea:trackingArea];
[trackingArea release];
}
int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways);
trackingArea = [ [NSTrackingArea alloc] initWithRect:[self bounds]
options:opts
owner:self
userInfo:nil];
[self addTrackingArea:trackingArea];
}
更多细节:
我在 NSScrollView 的视图中添加了 NSViews 作为子视图。每个 NSView 都有自己的跟踪区域,当我滚动滚动视图并离开跟踪区域时,不会调用“mouseExited”,但不滚动一切正常。问题是当我滚动时调用“updateTrackingAreas”,我认为这会产生问题。
* 仅 NSView 没有将其添加为子视图也有同样的问题,所以这不是问题。
【问题讨论】:
-
几乎没有什么需要考虑的。什么是超类?您是否在不发送 super 的情况下覆盖任何超类方法?然后,这里是我总是传递给 trackingArea 以确保鼠标真的总是被跟踪的选项: NSTrackingMouseEnteredAndExited|NSTrackingMouseMoved|NSTrackingActiveInKeyWindow
-
@Dimillian77 我更改为“NSTrackingMouseEnteredAndExited|NSTrackingMouseMoved|NSTrackingActiveInKeyWindow”,但这并没有帮助......同样的问题。如果没有“NSTrackingActiveAlways”,它根本不起作用。我更新了我的问题,让它更清晰。
-
您需要致电
[super updateTrackingAreas]。这段代码是在 NSViews 子类还是 NSScrollView 里面? -
@MarceloAlves 我没有调用它,它会在我滚动时自动调用。
标签: objective-c macos cocoa nstrackingarea