ページ

2008年4月26日土曜日

RubberBand(その11)再利用

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

必要な機能は大体できたので後で再利用可能な形にしておく。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上の画像の大きさや位置もそれに合わせて変更される。

関係はこんな感じ。