18

NSResponderにはマウスのダブルクリックイベントがないようです。ダブルクリックをキャッチする簡単な方法はありますか?

4

7 に答える 7

34

mouseDown:andメソッドはmouseUp:、を含むクリックに関する情報を含む引数としてNSEventオブジェクトを取りますclickCount

于 2010-02-02T00:34:04.760 に答える
8

通常、アプリケーションは-[mouseUp:]のclickCount == 2を調べて、ダブルクリックを判別します。

1つの改良点は、-[mouseDown:]でのマウスクリックの位置を追跡し、マウスの上の位置のデルタが小さいことを確認することです(xとyの両方で5ポイント以下)。

于 2013-03-21T15:05:38.030 に答える
8

単純な解決策の問題clickCountは、ダブルクリックが単に2回のシングルクリックと見なされることです。私はあなたがまだシングルクリックを取得することを意味します。そして、そのシングルクリックに対して異なる反応をしたい場合は、単なるクリックカウントに加えて何かが必要です。これが私が(Swiftで)最終的に得たものです:

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")
}
于 2015-08-21T13:32:52.703 に答える
7

NSEventに対して生成され、mouseDown:mouseUp:呼ばれるプロパティがありますclickCount。ダブルクリックが発生したかどうかを判断するには、2つであるかどうかを確認します。

実装例:

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

それをNSResponder(などのNSView)サブクラスに配置するだけです。

于 2013-10-20T18:13:45.990 に答える
2

私が好むmouseDown:+メソッドの代替はです。NSTimerNSClickGestureRecognizer

    let doubleClickGestureRecognizer = NSClickGestureRecognizer(target: self, action: #selector(self.myCustomMethod))
    doubleClickGestureRecognizer.numberOfClicksRequired = 2

    self.myView.addGestureRecognizer(doubleClickGestureRecognizer)
于 2018-10-01T08:43:34.623 に答える
1

@jayarjoに似たものを実装しましたが、これは、NSViewまたはそのサブクラスに使用できるという点で少しモジュール化されています。これは、クリックアクションとダブルアクションの両方を認識しますが、ダブルクリックのしきい値を超えるまでシングルクリックを認識しないカスタムジェスチャレコグナイザーです。

//
//  DoubleClickGestureRecognizer.swift
//

import Foundation
/// gesture recognizer to detect two clicks and one click without having a massive delay or having to implement all this annoying `requireFailureOf` boilerplate code
final class DoubleClickGestureRecognizer: NSClickGestureRecognizer {

    private let _action: Selector
    private let _doubleAction: Selector
    private var _clickCount: Int = 0

    override var action: Selector? {
        get {
            return nil /// prevent base class from performing any actions
        } set {
            if newValue != nil { // if they are trying to assign an actual action
                fatalError("Only use init(target:action:doubleAction) for assigning actions")
            }
        }
    }

    required init(target: AnyObject, action: Selector, doubleAction: Selector) {
        _action = action
        _doubleAction = doubleAction
        super.init(target: target, action: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(target:action:doubleAction) is only support atm")
    }

    override func mouseDown(with event: NSEvent) {
        super.mouseDown(with: event)
        _clickCount += 1
        let delayThreshold = 0.15 // fine tune this as needed
        perform(#selector(_resetAndPerformActionIfNecessary), with: nil, afterDelay: delayThreshold)        
        if _clickCount == 2 {
            _ = target?.perform(_doubleAction)
        }
    }

    @objc private func _resetAndPerformActionIfNecessary() {
        if _clickCount == 1 {
            _ = target?.perform(_action)
        }
        _clickCount = 0
    }
}

利用方法 :

let gesture = DoubleClickGestureRecognizer(target: self, action: #selector(mySingleAction), doubleAction: #selector(myDoubleAction))
button.addGestureRecognizer(gesture)

@objc func mySingleAction() {
 //  ... single click handling code here
}

@objc func myDoubleAction() {
 // ... double click handling code here
 }
于 2018-04-15T15:55:37.293 に答える
0

個人的には、mouseUp関数をダブルクリックしてチェックします。

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

    if ([theEvent clickCount] == 2)
    {

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

     }

}
于 2015-11-10T15:18:22.760 に答える