2017-05-24 2 views
0

Ich habe mit Mausklicks experimentiert. Ich bin ok mit den linken Mausklicks, die rohe Werte usw. erhalten. Ich möchte jetzt rechte Mausklicks hinzufügen. Ich habe ein grundlegendes Beispiel eingerichtet. Was ich erreichen möchte, wenn es einen Mausklick mit der rechten Maustaste gibt, führt es eine Funktion aus, und wenn es zwei Mausklicks gibt, führt es eine andere Funktion aus. Das Problem ist, wenn Sie zwei Mausklicks machen, kann es offensichtlich nicht zwischen den beiden unterscheiden und so die eine Mausklick-Funktion auslösen, bevor die zweite Mausfunktion ausgeführt wird. Ich dachte daran, vielleicht einen Timer zu verwenden, um die Anzahl der Klicks zu erfassen. Aber ich gehe im Kreis herum, als ob ich die Timer immer und immer wieder starten würde. Ich hoffe, jemand könnte helfen. Danke fürs Lesen hier ist der Code.Lesen der rechten Mausklicks Anzahl der Klicks

Xcode 8 Swift 3 Mac OSX Sierra NICHT IOS .. NICHT 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

ich wieder haben Sie den Code nach den Anweisungen gegeben erzeugt. Jetzt reflektiert der Code mehr von dem, was ich tun wollte. Mein einziges Problem ist, dass ich möchte, dass alle Mausoperationen nur in 'myView' statt im Hauptfenster ausgelöst werden. Ich dachte, es könnte etwas mit Ersthelfer zu tun haben, aber das scheint nicht zu funktionieren. Wieder würde jeder Gedanke geschätzt werden. Bitte entschuldigen Sie jeden schlechten Code, den ich selbst unterrichtet habe.

Xcode 8 Swift 3 Mac OSX Sierra NICHT IOS .. NICHT 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 Ich habe jetzt aktualisiert Subklassen, welche die View-Controller, so dass die Mausklicks sind jetzt nur in myView arbeiten. Ich habe immer noch Probleme mit 'func mouseDragged' Was ich erreichen muss, ist die linke untere Seite meiner Ansicht ist x = 0 und Y = 0. Ich hatte einen Versuch mit der Konvertierung, aber das funktioniert nicht. Ich hoffe, jemand könnte mich führen. Danke für das Lesen hier ist der aktualisierte Code.

Xcode 8 Swift 3 Mac OSX Sierra NICHT IOS .. NICHT 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 ist ein viel, viel einfacherer Weg: überschreiben Sie 'func mouseDown (mit event: NSEvent)' wo nötig, und machen Sie in dieser Methode 'if event.clickCount == 2 {stuff} else {sonstiges}}. Dann füge 'super.mouseDown (mit: event)' bei Bedarf hinzu. – Moritz

+0

Warum erstellen Sie das Fenster anstelle des View-Controllers? –

+0

Ich habe Code generiert und zum ursprünglichen Beitrag hinzugefügt – oldman

Antwort

0

Maus innen definieren sehen Sie

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

verwenden, wo nil das Fenster

hier ist der Endcode

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 
Verwandte Themen