アプリ上のオブジェクトをドラッグ&ドロップして他のアプリケーションへ持っていく場合には NSView の dragImage:at:offset:event:pasteboard:source:slideBack: を使えば容易に実装できる。このメソッドへ NSImage を渡せばドラッグ中のイメージとして表示することができる。
ここまでは簡単にできたのだが、できれば Safari などが実現しているようにドラッグ中のイメージを半透明にしたい。ところが該当するような APIが見つからない。簡単にはできないのかとあきらめた矢先、NSImage に対して lock を送ると絵が描けることに気がついた。それなら画像の NSImageとは別にもう一つ NSImageを作りここへ dissolveToPoint:fraction: を使って半透明で描画してあげれば行けるのでは?
// 画像をファイルから読み込む
NSImage* image1 = [[NSImage alloc] initWithContentsOfFile:@"hello.png"];
// 表示用の画像を別途用意。サイズは image1に合わせておく
NSImage* image2 = [[NSImage alloc] initWithSize:[image1 size]];
// image1の画像を image2へ半透明で描画する
[image2 lockFocus];
[image1 dissolveToPoint:NSZeroPoint fraction:0.5];
[image2 unlockFocus];
やってみると簡単にできた。dissolveToPoint:fraction: などの描画メソッドは NSView に対して使うものと思いこんでいたためにこんな簡単なことに気がつかなかった。この方法を使えば拡大・縮小・回転、他の画像との合成などなんでもできる。シンプルながらよくできた仕組みだね。