Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何使用NSTrackingArea_Cocoa_Macos - Fatal编程技术网

Cocoa 如何使用NSTrackingArea

Cocoa 如何使用NSTrackingArea,cocoa,macos,Cocoa,Macos,我是Mac编程新手,我想在光标进入或退出主窗口时触发事件。我读了一些关于NSTrackingArea的文章,但我不知道该怎么做。苹果公司提供了相关文档和示例 跟踪鼠标何时进入或退出窗口的最简单方法是在窗口的contentView中设置跟踪区域。但是,这不会跟踪窗口的工具栏 举个简单的例子,在自定义内容视图的代码中: - (void) viewWillMoveToWindow:(NSWindow *)newWindow { // Setup a new tracking area when

我是Mac编程新手,我想在光标进入或退出主窗口时触发事件。我读了一些关于NSTrackingArea的文章,但我不知道该怎么做。

苹果公司提供了相关文档和示例

跟踪鼠标何时进入或退出窗口的最简单方法是在窗口的contentView中设置跟踪区域。但是,这不会跟踪窗口的工具栏

举个简单的例子,在自定义内容视图的代码中:

- (void) viewWillMoveToWindow:(NSWindow *)newWindow {
    // Setup a new tracking area when the view is added to the window.
    NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
}

- (void) mouseEntered:(NSEvent*)theEvent {
    // Mouse entered tracking area.
}

- (void) mouseExited:(NSEvent*)theEvent {
    // Mouse exited tracking area.
}
您还应该实现NSView的updateTrackingAreas方法,并测试事件的跟踪区域,以确保它是正确的;需要实现
-viewWillMoveToWindow:
方法

我还想补充一点,如果要在调整视图大小时处理跟踪区域,您还需要实现此功能:

- (void)updateTrackingAreas
{
   // remove out-of-date tracking areas and add recomputed ones..
}

在自定义子类中,处理视图的更改几何图形;这将自动为您调用。

好的,这将是一个noob问题,但我必须将代码放在哪里?在哪里可以找到自定义视图的代码?我是否必须像使用Outlet和actions时那样将对象连接到Interface Builder中的视图?此代码应放在自定义UIView子类中。然后,应将自定义UIView添加为窗口的内容视图。使用Interface Builder,为窗口创建或选择一个内容视图,并使用Interface Builder inspector面板指定其类作为自定义UIView的类。非常确定您需要在上面的-viewWillMoveToWindow:方法末尾使用[trackingArea release]。使用
initWithRect:[self frame]
对我不起作用,但是,
initWithRect:[self-bounds]
做到了。正如@x3ro提到的,initWithRect:self.bounds是正确的,请参阅文档。rect不能超过视图的边界,并且相对于视图的坐标空间,因此边界是正确的,而不是框架。是否要修复@MattBierner?如果不希望在调整视图大小后重新计算跟踪区域,请在创建NSTrackingVisibleRect区域时使用NSTrackingVisibleRect选项。@标记您的注释是本页最重要的注释之一!