2011年6月15日水曜日

CALayer で move とか pinch 操作と拡大縮小処理の自前実装

コードの実例を減らして言葉で解説します。
まずtouchesなんたらについて
touchesBeganで現在何本の指がタッチされているのかは取得出来ません。
取得出来るのはtouchesMovedだけです。
取得の仕方は以下


int i=0;
int divx,divy;

CGPoint nowTouchPoint[20], PrevTouchPoint[20];

for(UITouch *touch in [event allTouches])
{
    PrevTouchPoint[i]  = [touch previousLocationInView:self];
    nowTouchPoint[i] = [touch locationInView:self];
    i++;
}


どのくらい動いたのかは以下のようにすると取れる

divx = (nowTouchPoint[0].x - PrevTouchPoint[0].x);        
divy = (nowTouchPoint[0].y - PrevTouchPoint[0].y);


CALayerの位置をdivx,divy分だけ移動すれば指で移動が出来る。

ピンチ処理をしたい場合は、
1.PrevTouchPointとnowTouchPointの比から、
拡大縮小率を計算し、それに合わせてCALayerのframeを変更する
2.PrevTouchPointから中間点を計算し、
その座標をCALayer座標系に変換してからCALayerのanchorに設定する
3.2の中間点(画面上の座標)へCALayer を setPosition する。
このとき、画面の上下左右に入るように
CALayerのsetPosition 位置を修正する必要がある。

という事をやると、指でタッチした位置の中間点を中心にして拡大縮小が出来る。

もちろんスクロールとかにCALayerを乗せれば自前なんてやる必要ないんだけど、
どうしても自前実装しなければならない時にご参考ください。

0 件のコメント: