必要な機能は大体できたので後で再利用可能な形にしておく。NSViewに完全に依存しているのでこの単位で再利用することにする。すなわち RubberBandView(NSViewのサブクラス)を再利用することになる。再利用する場合、元の画像なりデータがあり、その大きさをを RubberBandViewを使って変更することになる。この時に必要なのは、RubberBandViewの初期値を設定することと、RubberBandViewが変更された時にそれを元画像へ伝えることの2つ。
前者は RubberBandView#setRubberBandFrame: を実装することで対応する。後者はデリゲートの仕組みを導入しよう。RubberBandView のメンバ変数に _delegate を追加し、大きさが変化する毎にこのオブジェクトへメッセージを送信する。ここではプロトコルを定義して、デリゲートはこのプロトコルに適合するよう条件づけてやる。
@protocol RubberBandDelegate
-(void)changedFrame:(NSRect)frame;
@end
@interface RubberBandView : NSView {
NSRect _rect;
id_delegate;
}
そしてサイズ変更や移動時に changedFrame: を投げてやる。
再利用可能にした RubberBandViewを使ったサンプルを作ってみた。
ソース:RubberBand-8.zip
前回そっくりだが構造が違う。サンプルではもう一枚のビュー(ImageView)を導入してここに画像を描いている。この ImageViewを RubberBandViewのデリゲートとして設定すると、RubberBandの変更にともない、ImageView上の画像の大きさや位置もそれに合わせて変更される。
関係はこんな感じ。