1

我正在开发一个具有全尺寸 NSOpenGLView 窗口的应用程序。我正在使用 [view addCursorRect] 和 [cursor set] 来显示自定义光标,但是当我按下键盘上的任意键时,光标会重置为默认箭头。我还尝试过在按下某个键时覆盖 resetCursorRects 并调用 invalidateCursorRects,这会导致光标闪烁。

当我单击视图中的任意位置时,光标会切换回我的自定义光标,所以我想键盘按下以某种方式使我的视图失去焦点。有什么方法可以防止我按键时视图变得不集中?

4

1 回答 1

0

您需要记住您的光标设置 + 当您需要重置调用时,例如 refreshCursor 方法。示例实现:

- (void)refreshCursor
{
    NSCursor *cursor = nil;
    if ([self graphic]) {
        cursor = [graphic hoverCursorForPoint:[self mousePosition]];
    } else if ([self group]){
        cursor = [NSCursor openHandCursor];
    }
    [self setHoverCursor:cursor];
    [self refresh];
}

- (void)updateTrackingAreas
{
    [super updateTrackingAreas];
    [self removeTrackingArea:[self trackingArea]];
    NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self visibleRect]
                                                        options:NSTrackingActiveAlways|NSTrackingMouseEnteredAndExited|NSTrackingMouseMoved
                                                          owner:self userInfo:nil];
    [self setTrackingArea:area];
    [self addTrackingArea:[self trackingArea]];
}

- (void)setCursorRects
{
    [self discardCursorRects];
    if ([self hoverCursor]) {
        [self addCursorRect:[self visibleRect] cursor:[self hoverCursor]];
    }
}

- (void)setHoverCursor:(NSCursor *)hoverCursor {
    if (_hoverCursor != hoverCursor) {
        _hoverCursor = hoverCursor;
        [self setCursorRects];
    }
}

- (void)resetCursorRects {
    [super resetCursorRects];
    [self setCursorRects];
}

- (void)mouseExited:(NSEvent *)event
{
    [[NSCursor currentSystemCursor] set];
}

- (void)mouseEntered:(NSEvent *)event
{
}

- (void)mouseMoved:(NSEvent *)event
{
    [self refreshCursor];
}

- (void)keyUp:(NSEvent *)event
{
  [self refreshCursor];
}

//allow key events
- (BOOL)acceptsFirstResponder
{
    return YES;
}
于 2016-10-12T14:14:03.857 回答