2017-05-24 2 views
0

나는 마우스 클릭으로 실험 해왔다. 원시 마우스 값을 얻는 등 마우스 왼쪽 버튼을 클릭해도 괜찮습니다. 이제 마우스 오른쪽 버튼을 추가하고 싶습니다. 기본 예제를 설정했습니다. 마우스 오른쪽 버튼을 한 번 클릭하면 하나의 기능을 수행하고 마우스 오른쪽 버튼을 두 번 누르면 다른 기능이 수행됩니다. 문제는 두 번 마우스를 클릭하면 분명히 둘 사이를 구별 할 수 없으므로 두 번째 마우스 기능을 수행하기 전에 한 번의 마우스 클릭 기능을 실행하는 것입니다. 어쩌면 클릭 수를 기록하기 위해 일종의 타이머를 사용하려고 생각했습니다. 하지만 타이머를 반복해서 시작하는 것처럼 서클에서 둥글게됩니다. 나는 어떤 사람이 도울 수 있기를 바라고 있습니다. 여기서 읽어 주셔서 감사합니다.오른쪽 마우스 클릭 읽기 수 클릭

엑스 코드 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'내부에서만 트리거하고 싶습니다. 첫 번째 응답자와 관련이 있다고 생각했지만 제대로 작동하지 않는 것 같습니다. 다시 한번 생각해보십시오. 자기가 가르치는 나쁜 코드는 용서해주세요.

엑스 코드 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 

업데이트 2 지금 뷰 컨트롤러를 서브 클래스 업데이트, 그래서 마우스 클릭은 이제 MYVIEW에서 일하고있다. 난 여전히 'func mouseDragged'에 문제가있다. 내 시각의 왼쪽 하단은 x = 0이고 Y = 0이다. 나는 변환을 시도했지만 작동하지 않는다. 누군가 나를 인도 해주기를 바래. 여기를 읽어 주셔서 감사합니다.

엑스 코드 8 스위프트 3 맥 OSX 시에라하지 IOS .. 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 (이벤트 : NSEvent)'을 필요에 따라 오버라이드하고,이 메소드에서는 if event.clickCount == 2 {stuff} else {other stuff}'를 수행하십시오. 그런 다음 필요에 따라'super.mouseDown (with : event)'를 추가하십시오. – Moritz

+0

View Controller 대신 창을 서브 클래 싱하는 이유는 무엇입니까? –

+0

코드를 생성하고 원래 게시물에 추가했습니다. – oldman

답변

0

정의하지 마우스 내부는 전무 창 여기

에게 있습니다

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 
관련 문제