2010-02-02 71 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); 

    } 

}