2017-05-24 21 views
0

マウスのクリックを試しています。私はマウスの左クリックで元の値などを取得するなど、私は今右のマウスクリックを追加したいと思います。基本的な例をセットアップしました。マウスの右クリックが1つあれば、それは1つの機能を実行し、2つのマウスの右クリックがあれば、別の機能を実行します。問題は、2回のマウスクリックをすると明らかに2つのマウスを区別できないため、2回目のマウス機能を実行する前に1回のマウスクリック機能を起動することです。 私は多分、何らかの種類のタイマーを使用してクリック数を記録することを考えていました。しかし、私はちょうどタイマを何度も何度もやり直しているように見えるので、丸で囲まれてしまいます。私はある人が助けてくれることを望んでいる。ここで読んでいただきありがとうございますコードです。右クリックを読むクリック数

Xcodeの8スウィフト3マックOSXシエラませIOS .. NOT IOS

import Cocoa 

class MainWindowController: NSWindowController { 

    @IBOutlet weak var MyView: NSView! 

    override func windowDidLoad() { 
     super.windowDidLoad() 

     //Initialize mouse for Right Click numberOfClicksRequired = 1 
     let recogRightClick1 = NSClickGestureRecognizer(target: self, action: #selector(oneMouseClick)) 
     recogRightClick1.buttonMask = 0x2 
     recogRightClick1.numberOfClicksRequired = 1 
     MyView.addGestureRecognizer(recogRightClick1) 

     //Initialize mouse for Right ClicknumberOfClicksRequired = 2 
     let recogRightClick2 = NSClickGestureRecognizer(target: self, action: #selector(twoMouseClick(myrec:myRightClick:))) 
     recogRightClick2.buttonMask = 0x2 
     recogRightClick2.numberOfClicksRequired = 2 
     MyView.addGestureRecognizer(recogRightClick2) 
    }//EO Overide 


    func oneMouseClick(myrec: NSPanGestureRecognizer,myRightClick:NSClickGestureRecognizer){ 
     let rightClick = myRightClick.state.rawValue 
     print("oneMouseClick",rightClick) 
    } 


    func twoMouseClick(myrec: NSPanGestureRecognizer,myRightClick:NSClickGestureRecognizer){ 
     let rightClick = myRightClick.state.rawValue 
     print("twoMouseClick",rightClick) 
    } 


}//EnD oF thE wORld 

私は与えられたアドバイス、次のコードを生成し直している

UPDATE。今、コードは私がしたいことの多くを反映しています。私の唯一の問題は、メインウィンドウ内ではなく、すべてのマウス操作が 'myView'内でのみ起動されるようにすることです。私はそれが最初の応答者と関係があるかもしれないと思ったが、それはうまくいかないようだ。やはりどんな考えも認められるだろう。私が教えている悪いコードは許してください。

Xcodeの8スウィフト3マックOSXシエラませIOS .. NOT IOS

import Cocoa 

class MainWindowController: NSWindowController { 

    @IBOutlet weak var myView: NSView! 
    var mouseX:CGFloat = 0 
    var mouseY:CGFloat = 0 

    override func windowDidLoad() { 
     myView.window?.becomeFirstResponder() 
     myView.window?.acceptsMouseMovedEvents = true 
     super.windowDidLoad() 

     myView.wantsLayer = true 
     myView.layer?.backgroundColor = CGColor(red: 0.05, green: 0.57, blue: 0.80, alpha: 0.6) 

     NSEvent.addLocalMonitorForEvents(matching:.leftMouseDown){ 
      self.mouseEventFunction(data: 1) 
      return $0 
     } 

     NSEvent.addLocalMonitorForEvents(matching:.leftMouseUp){ 
      self.mouseEventFunction(data:2) 
      return $0 
     } 

     NSEvent.addLocalMonitorForEvents(matching:.rightMouseDown){ 
      self.mouseEventFunction(data: 3) 
      return $0 
     } 

     NSEvent.addLocalMonitorForEvents(matching:.rightMouseUp){ 
      self.mouseEventFunction(data: 4) 
      return $0 
     } 


     NSEvent.addLocalMonitorForEvents(matching:.mouseMoved) { 
      self.mouseX = NSEvent.mouseLocation().x 
      self.mouseY = NSEvent.mouseLocation().y 
      return $0 } 

    }//EO Overide 



    func mouseEventFunction (data: Int){ 
     switch data{ 
     case 1 : 
      print("LeftMouseDown") 
     case 2 : 
      print("LeftMouseUp") 
     case 3 : 
      print("RightMouseDown") 
     case 3 : 
      print("RightMouseUP") 
     default: break 
        } 

     if data == 1 {print("mouseX",mouseX,"mouseY",mouseY)} 

    }//eo mouseEvent 



}//EnD oF thE wORld 

UPDATE 2 私は今、ビューコントローラのサブクラスを更新しているので、マウスクリックは、今だけMYVIEWで作業しています。私はまだ 'func mouseDragged'に問題があります。私の達成する必要があるのは、私のビューの左下がx = 0、Y = 0です。私は変換を試みましたが、動作していません。誰かが私を導くかもしれないことを望みます。ここをクリックしてくれてありがとう、更新されたコードです。内部のマウスを定義するには

Xcodeの8スウィフト3マックOSXシエラませIOS .. NOT IOS

import Cocoa 

class MainWindowController: NSWindowController { 

    @IBOutlet weak var myView: NSView! 

    override func windowDidLoad() { 
     myView.window?.becomeFirstResponder() 
     myView.window?.acceptsMouseMovedEvents = true 
     window?.contentView?.addSubview(myView) 
     super.windowDidLoad() 

    }//EO Overide 


}//EnD oF thE wORld 


class testView: NSView { 

    override func draw(_ dirtyRect: NSRect) { 
     let backgroundColor = NSColor.lightGray 
     backgroundColor.set() 
     NSBezierPath.fill(bounds) 
    } 

    override func mouseDragged(with theEvent: NSEvent) { 
     let myLocationInWindow = theEvent.locationInWindow 
     let location = convert(myLocationInWindow, to: self) 
     Swift.print("myLocationInWindow",myLocationInWindow,"location",location) 
    } 

    override func mouseDown(with theEvent: NSEvent) { 
     Swift.print("mouseDown") 
    } 

    override func mouseUp(with theEvent: NSEvent) { 
     Swift.print("mouseUp clickCount: \(theEvent.clickCount)") 
    } 


}//eo testView 
+0

Ther eははるかに簡単な方法です。必要に応じて 'func mouseDown(event:NSEvent)'をオーバーライドします。このメソッドでは、if event.clickCount == 2 {stuff} else {other stuff} 'を実行します。必要に応じて 'super.mouseDown(with:event)'を追加します。 – Moritz

+0

なぜView Controllerではなくウィンドウをサブクラス化していますか? –

+0

私はコードを生成して元の投稿に追加しました – oldman

答えて

0

あなたは

nilの窓

がここにあるさ

let myLocationInWindow = theEvent.locationInWindow 
let location = convert(myLocationInWindow, from: nil) 

を使用して表示します最終コード

import Cocoa 

class MainWindowController: NSWindowController { 

    @IBOutlet weak var myView: NSView! 

    override func windowDidLoad() { 
     super.windowDidLoad() 
    }//EO Overide 


}//EnD oF thE wORld 


class testView: NSView { 

    override func draw(_ dirtyRect: NSRect) { 
     let backgroundColor = NSColor.lightGray 
     backgroundColor.set() 
     NSBezierPath.fill(bounds) 
    } 

    override func mouseDragged(with theEvent: NSEvent) { 
     let myLocationInWindow = theEvent.locationInWindow 
     let location = convert(myLocationInWindow, from: nil) 
     Swift.print("location",location) 
    } 

    override func mouseDown(with theEvent: NSEvent) { 
     Swift.print("mouseDown") 
    } 

    override func mouseUp(with theEvent: NSEvent) { 
     Swift.print("mouseUp clickCount: \(theEvent.clickCount)") 
    } 

}//eo testView 
関連する問題