我正在开发一款适用于Mac的Today Extension,它可以控制iTunes。它的工作和一切,但我的UI包括一个方形封面艺术图像,覆盖效果视图,其中包含元数据和控件:
现在,很明显,如果我能以某种方式让它们出现在我需要的时候 - 当鼠标光标位于我的扩展视图之上时,那就太好了。
由于我之前已经处理过这类事情,所以我决定将一个NSView
子类放在一起,使用NSTrackingArea
在鼠标进入或存在其边界时触发通知:
/**
* Sets up the tracking area, for the entire bounds of the view.
*/
- (void) setUpTrackingRect {
_trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds
options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingInVisibleRect
owner:self
userInfo:nil];
[self addTrackingArea:_trackingArea];
}
/**
* Mouse entry: send TSMouseTrackingViewMouseEntered notification.
*/
- (void) mouseEntered:(NSEvent *) theEvent {
NSLog(@"Mouse Enter");
[[NSNotificationCenter defaultCenter] postNotificationName:TSMouseTrackingViewMouseEntered
object:self];
}
/**
* Mouse exit: send TSMouseTrackingViewMouseLeft notification.
*/
- (void) mouseExited:(NSEvent *) theEvent {
NSLog(@"Mouse Exit");
[[NSNotificationCenter defaultCenter] postNotificationName:TSMouseTrackingViewMouseLeft
object:self];
}
(摘自我的完整代码on GitHub.)
那些NSLog
用于帮助我进行调试:它们永远不会触发,尽管我的光标移入和移出视图没有问题。
我一直在查看Apple的文档,我找不到任何明确禁止此类内容的内容,或者解释为什么它不起作用。它是NSView
中的标准NSViewController
子类,但显示在通知中心,而不是独立应用。
对于为什么这个简单的跟踪区域视图在今天扩展中不起作用的任何建议都表示赞赏。