2017-09-07 14 views
0

私のMac OSアプリケーションでは、このNSImageViewで(ユーザによってトリガされた)mouseDownイベントが発生した後、NSView内でNSImageViewを移動できる機能が必要です。ユーザーがマウスUpイベントをトリガーすると、このビューは最後のmouseDragイベント方向に移動し、そこにとどまる必要があります。移動中に、NSImageViewを画面上に表示したい(マウスカーソルと共に移動する必要があります)。Cocoaで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のためのObjective Cのコード内のコードが含まれては時代遅れです。私は、GitHubやその他のStackOverflowスレッドでソリューションを検索しようとしましたが、実際のソリューションは見つかりませんでした。

この質問の回答を聞いてうれしいです。私はNSImageViewにこのクラスを設定したInterface Builderでその後

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.

を使用しています。また、このNSImageViewのためにInterface Builderで制約を設定しました。

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によると、マウスポインターを移動するためのオブジェクトが1つ以上あるNSViewコンテナがあります。このような場合、サブクラス化するのはNSViewです。 –

+2

@ElTomato NSImageViewは結局NSViewから継承され、NSView内にNSImageViewを置くことは非常に一般的なOOPです。何が問題なの? – brianLikeApple

+0

ありがとう@brianLikeApple、あなたのソリューションは素晴らしい作品! – Adelmaer

関連する問題