2017-09-07 3 views
0

내 Mac OS 응용 프로그램에서이 NSImageView에서 mouseDown 이벤트 (사용자에 의해 트리거 된)가 발생한 후 NSView 내부를 NSImageView로 이동할 수있는 기능이 필요합니다. 사용자가 마우스 Up 이벤트를 트리거하면이보기는 마지막 mouseDrag 이벤트 방향으로 이동하여 거기에 머물러 야합니다. 이동 중에 NSImageView를 화면에 표시하려면 마우스 커서와 함께 이동해야합니다.코코아에서 NSView 내에서 NSImageView를 이동하는 방법은 무엇입니까?

내가 애플에 의해 처리 마우스 이벤트 가이드를 읽었습니다, https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html 는 또한 내가이 샘플 코드를 다운로드 한 : https://developer.apple.com/library/content/samplecode/DragItemAround/Introduction/Intro.html

모두 링크가 DragItemAround위한 목적 C. 코드에 코드를 포함 구식이다. GitHub 및 다른 StackOverflow 스레드에서 솔루션을 검색하려고했지만 작동중인 솔루션을 찾지 못했습니다.

이 질문에 대한 답변을 듣고 기꺼이 들려주십시오. 내가 NSImageView이 클래스를 설정 한 인터페이스 빌더에서 그 후

import Cocoa 

class MovableImageView: NSImageView { 

    override func draw(_ dirtyRect: NSRect) { 
     super.draw(dirtyRect) 

     // Drawing code here. 
     // setup the starting location of the 
     // draggable item 

    } 

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

     //let window = self.window! 
     //let startingPoint = event.locationInWindow 


    } 


    override func mouseDragged(with event: NSEvent) { 
     Swift.print("mouseDragged") 

     self.backgroundColor = NSColor.black 

    } 

    override func mouseUp(with event: NSEvent) { 
     Swift.print("mouseUp") 
    } 

} 

: 나는이 코드 NSImageView의 서브 클래스는 사용자 정의 MovableImageView을 만든 스위프트 3.

을 사용하고 있습니다. Interface Builder에서이 NSImageView에 대한 제약 조건을 설정했습니다.

NSView 내에서 NSImageView를 움직이는 방법을 알아 내려고하고 있습니다. (Swift 3, XCode 8)

+0

을 당신은 잘못 생물을 서브 클래스된다. 대신 NSView를 서브 클래스하십시오. –

+2

@ElTomato 아니요, NSImageVIew는 NSView의 하위 클래스 인 NSControl의 하위 클래스입니다. 그러니 괜찮을거야. – brianLikeApple

답변

1

mouseDown 지점을 저장하고 나중에 오프셋에 사용해야합니다. 다만 다음과 같은 하위 뷰로이 MovableImageView을 추가, 상위보기에서

class MovableImageView: NSImageView { 

var firstMouseDownPoint: NSPoint = NSZeroPoint 

init() { 
    super.init(frame: NSZeroRect) 
    self.wantsLayer = true 
    self.layer?.backgroundColor = NSColor.red.cgColor 
} 

required init?(coder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

override func draw(_ dirtyRect: NSRect) { 
    super.draw(dirtyRect) 

    // Drawing code here. 
} 

override func mouseDown(with event: NSEvent) { 
    Swift.print("mouseDown") 
    firstMouseDownPoint = (self.window?.contentView?.convert(event.locationInWindow, to: self))! 
} 

override func mouseDragged(with event: NSEvent) { 
    Swift.print("mouseDragged") 
    let newPoint = (self.window?.contentView?.convert(event.locationInWindow, to: self))! 
    let offset = NSPoint(x: newPoint.x - firstMouseDownPoint.x, y: newPoint.y - firstMouseDownPoint.y) 
    let origin = self.frame.origin 
    let size = self.frame.size 
    self.frame = NSRect(x: origin.x + offset.x, y: origin.y + offset.y, width: size.width, height: size.height) 
} 

override func mouseUp(with event: NSEvent) { 
    Swift.print("mouseUp") 

    } 
} 

: 다음 코드를 확인하시기 바랍니다

let view = MovableImageView() 
view.frame = NSRect(x: 0, y: 0, width: 100, height: 100) 
self.view.addSubview(view) //Self is your parent view 

enter image description here

+0

그건 바보 같아. Adelmaer는 마우스 포인터로 재배치 할 하나 이상의 객체가있는 NSView 컨테이너가 있다고 말합니다. 이 경우 서브 클래스해야하는 것은 NSView입니다. –

+2

@ElTomato NSImageView는 결국 NSView에서 상속 받고 NSImageView를 NSView에 넣으면 매우 일반적인 OOP입니다. 그게 뭐가 잘못 되었 니? – brianLikeApple

+0

감사합니다. @brianLikeApple, 당신의 솔루션은 훌륭하게 작동합니다! – Adelmaer

관련 문제