2010-02-02 72 views

回答

25

mouseDown:mouseUp:方法将NSEvent对象作为参数提供有关点击的信息,其中包括clickCount

4

一般应用程序会查看clickCount == 2 - [mouseUp:]以确定双击。

一个细化是跟踪鼠标点击 - [mouseDown:]的位置,并看到鼠标位置上的增量小(x和y均为5分或更少)。

+1

恕我直言,这是最有用的答案,因为它也回答了隐是否对第二个mouseDown或第二个mouseUp作出反应的问题。当然,在某些情况下,偏离标准可能是有意义的。不幸的是,苹果自己并不完全遵循一个标准(查找器和邮件在上,日历在下)...... – fzwo 2014-05-06 10:34:54

4

NSEvent产生的mouseDown:mouseUp:有一个属性,称为clickCount。检查是否有两个确定是否发生了双击。

样品实施:

- (void)mouseDown:(NSEvent *)event { 
    if (event.clickCount == 2) { 
     NSLog(@"Double click!"); 
    } 
} 

只需将在你的NSResponder(如NSView)的子类。

+0

如果你需要同时处理 - 单击和双击,你通常会做什么。很明显,如果最终结果是双击,你将不得不忽略单击。 – jayarjo 2015-08-05 12:35:04

+0

@jayarjo - 如果事实证明双击是必要的,那么我不能想到任何单击单击操作都不应该完成的地方。在文本字段中,只需点击一下鼠标即可将光标置于特定位置。双击突出显示整个单词。所以在单击时移动光标是无害的。在RTS游戏(至少暴雪的)中,一次点击选择一个单位,而双击则选择该类型的所有单位。如果您想要双击完成与单击操作完全不同的操作,您可能需要重新考虑整个用户体验。 – ArtOfWarfare 2015-08-05 14:46:30

6

普通clickCount解决方案的问题在于双击仅被视为两次单击。我的意思是你仍然得到单击。如果你想对这一点击做出不同的反应,你只需点击点击就能获得一些东西。以下是我已经结束了(斯威夫特):

private var _doubleClickTimer: NSTimer? 

// a way to ignore first click when listening for double click 
override func mouseDown(theEvent: NSEvent) { 
    if theEvent.clickCount > 1 { 
     _doubleClickTimer!.invalidate() 
     onDoubleClick(theEvent) 
    } else if theEvent.clickCount == 1 { // can be 0 - if delay was big between down and up 
     _doubleClickTimer = NSTimer.scheduledTimerWithTimeInterval(
      0.3, // NSEvent.doubleClickInterval() - too long 
      target: self, 
      selector: "onDoubleClickTimeout:", 
      userInfo: theEvent, 
      repeats: false 
     ) 
    } 
} 


func onDoubleClickTimeout(timer: NSTimer) { 
    onClick(timer.userInfo as! NSEvent) 
} 


func onClick(theEvent: NSEvent) { 
    println("single") 
} 


func onDoubleClick(theEvent: NSEvent) { 
    println("double") 
} 
0

就个人而言,我检查双击进入mouseUp事件功能:

- (void)mouseUp:(NSEvent *)theEvent 
{ 

    if ([theEvent clickCount] == 2) 
    { 

     CGPoint point = [theEvent locationInWindow]; 
     NSLog(@"Double click on: %f, %f", point.x, point.y); 

    } 

}