已调用 cursorUpdate,但未更新光标

Jen*_*sen 4 cocoa cursor nstextview nscursor

我已经为此工作了几个小时,不知道出了什么问题。我想要一个按钮的自定义光标,它是 NSTextView 的子视图,我添加了一个跟踪区域并在鼠标输入按钮时发送 cursorUpdate 消息。

每次鼠标进入跟踪区域时都会调用 cursorUpdate 方法。但光标停留在 IBeamCursor。

有任何想法吗?

Apple Docs 的参考:管理光标更新事件

- (void)cursorUpdate:(NSEvent *)event {
    [[NSCursor arrowCursor] set];
}

- (void)myAddTrackingArea {
    [self myRemoveTrackingArea];

    NSTrackingAreaOptions trackingOptions = NSTrackingCursorUpdate | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow;
    _trackingArea = [[NSTrackingArea alloc] initWithRect: [self bounds] options: trackingOptions owner: self userInfo: nil];
    [self addTrackingArea: _trackingArea];
}

- (void)myRemoveTrackingArea {
    if (_trackingArea)
    {
        [self removeTrackingArea: _trackingArea];
        _trackingArea = nil;
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

我遇到了同样的问题。

问题是,NSTextView每次收到mouseMoved:事件时都会更新其游标。本次活动是由自我更新引发NSTrackingAreaNSTextView,它总是跟踪的可见部分NSTextViewNSScrollView。所以我能想到的可能有两种解决方案。

  1. 覆盖updateTrackingAreas删除 Cocoa 提供的跟踪区域,并确保您始终创建一个新的而不是排除按钮。(我不会这样做!)

  2. 覆盖mouseMoved:并确保当光标位于按钮上时它不会调用 super。

    - (void)mouseMoved:(NSEvent *)theEvent {
        NSPoint windowPt = [theEvent locationInWindow];
        NSPoint superViewPt = [[self superview]
              convertPoint: windowPt  fromView: nil];
        if ([self hitTest: superViewPt] == self) {
            [super mouseMoved:theEvent];
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)