如何使用NSTrackingArea

ica*_*ant 10 macos cocoa

我是Mac编程的新手,我想在光标进入或退出主窗口时触发事件.我读了一些关于NSTrackingArea的内容,但我不明白该怎么做.

Mat*_*ner 15

Apple提供NSTrackingAreas的文档和示例.

跟踪鼠标何时进入或存在窗口的最简单方法是在窗口的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.
}
Run Code Online (Sandbox Code Playgroud)

您还应该实现NSView的updateTrackingAreas方法并测试事件的跟踪区域以确保它是正确的.

  • 使用`initWithRect:[self frame]`对我来说不起作用,但`initWithRect:[self bounds]`确实如此. (8认同)
  • 此代码应放在自定义UIView子类中.然后应该将自定义UIView添加为窗口的内容视图.使用Interface Builder,为窗口创建或选择内容视图,并使用Interface Builder检查器面板将其类指定为自定义UIView的类. (3认同)

pet*_*ert 5

Matt Bierner的回答真的帮助了我; 需要实现-viewWillMoveToWindow:方法.

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

- (void)updateTrackingAreas
{
   // remove out-of-date tracking areas and add recomputed ones..
}
Run Code Online (Sandbox Code Playgroud)

在自定义子类中,处理视图的变化几何; 这将自动为您调用.

  • 如果您希望在调整视图大小后不必重新计算跟踪区域,请在创建**NSTrackingArea**时使用**NSTrackingInVisibleRect**选项. (26认同)
  • @mark你的评论是这个页面上最重要的评论之一! (4认同)