Nakajijapan

生きるのに必死です。

OSX ドラッグアンドドロップの調査

ドラッギングアンドドロップ関連の調査

NSDraggingSource

プロトコルメソッドで、Dragging Session内のオブジェクトによって実装される。 ドラッグ操作中に受け取るメッセージ

draggingSession(_:sourceOperationMaskForDraggingContext:)

ドラッギングしている状況を教えて、どんなドラッグのタイプを許すか設定します。

1
2
3
4
5
enum NSDraggingContext : Int {

    case OutsideApplication
    case WithinApplication
}

ドラッグ操作のマスク。ここでどんな操作を許すのかの種類

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct NSDragOperation : RawOptionSetType {
    init(_ rawValue: UInt)
    init(rawValue: UInt)

    static var None: NSDragOperation { get }
    static var Copy: NSDragOperation { get }
    static var Link: NSDragOperation { get }
    static var Generic: NSDragOperation { get }
    static var Private: NSDragOperation { get }
    static var Move: NSDragOperation { get }
    static var Delete: NSDragOperation { get }
    static var Every: NSDragOperation { get }

    static var All_Obsolete: NSDragOperation { get } // Use NSDragOperationEvery
    static var All: NSDragOperation { get } // Use NSDragOperationEvery
}

以下は、指定されたスクリーン上をトリガーにして呼び出されるメソッド その時の位置も保持している。

draggingSession(_:willBeginAtPoint:)

スクリーン上でドラッグされ始めたときに呼び出される

draggingSession(_:endedAtPoint:operation:)

スクリーン上でドラッグが終了したときに呼び出される

draggingSession(_:movedToPoint:)

スクリーン上でドラッグされているときに呼び出される

NSDraggingDestination

プロトコルメソッド。実装したViewに対してイベントが呼び出される

1
2
3
4
draggingEntered(_:)
draggingUpdated(_:)
draggingEnded(_:)
draggingExited(_:)

以下は、ドロップ処理の実行要求。 上記メソッドでドロップ可能と返した状態でこのテキストフィールド上でマウスボタンを放した時に呼び出されます。

1
2
prepareForDragOperation(_:)
performDragOperation(_:)

ここでドラッグしたオブジェクトが対象のオブジェクトに対してどうゆう処理をするのかを実装する

NSDraggingSession

ドラッグアンドドロップ関連の処理を提供してくれる。ドラッグ処理中に編集を許可する。

Example

以下のようにして対象のオブジェクトを監視する

1
2
3
4
5
6
7
8
var draggingSession:NSDraggingSession = self.beginDraggingSessionWithItems([dragItem], event: theEvent, source: self)

# 失敗したときに画像をもとの位置に戻すかどうか
draggingSession.animatesToStartingPositionsOnCancelOrFail = true

# ドラッグしている状態のビジュアルをどんな表現するかの設定
#    None: 画像をポイントに維持させる
draggingSession.draggingFormation = NSDraggingFormation.None

まとめ

ここで対象のオブジェクトをドラッグアンドドロップできるようになる。 たとえばFinderにある画像を実装したオブジェクトに画像とかをドロップできたりできる。 ただ、実装したオブジェクトをドラッグしてFinderにドロップして(画像を保存したり)はできないのでもうすこし調査が必要。

参照