取消隐藏光标滞后

时间:2017-04-15 12:48:18

标签: objective-c cocoa nscursor

我有一个弹出窗口的一部分,我用线条绘制一个自定义光标。因此,我不希望标准光标显示在某个区域内(isInDiagram)。

这是我的代码:

- (void)mouseMoved:(NSEvent *)theEvent {
   position = [self convertPoint:[theEvent locationInWindow] fromView:nil];
   if(![self isInDiagram:position]) {
       [NSCursor unhide];
   }
   else{
       [NSCursor hide];
   }
   [self setNeedsDisplay: YES];
}

- (bool) isInDiagram: (NSPoint) p {
   return (p.x >= bborder.x + inset) && (p.y >= bborder.y + inset) &&
   (p.x <= self.window.frame.size.width - bborder.x - inset) &&
   (p.y <= self.window.frame.size.height - bborder.y - inset);
}

现在隐藏光标的效果非常好但是隐藏总是滞后。我无法弄清楚最终会触发光标再次显示的内容。但是,如果我循环unhide命令取消隐藏工作:

for (int i = 0; i<100; i++) {
     [NSCursor unhide];
}

如何在不使用此uggly循环的情况下解决此问题的任何想法?

1 个答案:

答案 0 :(得分:2)

来自文档:

  

每次调用取消隐藏都必须通过调用hide来平衡   命令光标显示正确。

当您移动鼠标时,它会隐藏多次。如果光标尚未隐藏而不是隐藏,则需要标记。它应该只隐藏一次。

- (void)mouseMoved:(NSEvent *)theEvent {
   position = [self convertPoint:[theEvent locationInWindow] fromView:nil];
   BOOL isInDiagram = [self isInDiagram:position]
   if(!isInDiagram && !CGCursorIsVisible()) {
       [NSCursor unhide];
   }
   else if (isInDiagram && CGCursorIsVisible()){ // cursor is not hidden
       [NSCursor hide];
   }
   [self setNeedsDisplay: YES];
}

注意CGCursorIsVisible已弃用,您可以维护自己的标记来跟踪光标隐藏状态。