さて、こんばんわ。

今日は前置きなしで始めましょう。

前回は、touchesBeganメソッドは画面がタッチされた時に発生するものでした。

それの冒頭部分の説明だけをやりましたね(・∀・)

ではパネルをくるくる回すためにどのパネルが押されたか座標を取得する必要があります。

UITouch *aTouch = [touches anyObject];
CGPoint pos = [aTouch locationInView:self.view];
pos = [backView.layer convertPoint:pos toLayer:backView.layer.superlayer];


1行目の
UITouch *aTouch = [touches anyObject];
についてです。
このメソッドが呼ばれたときは、なんらかのタッチが画面に対しておこなわれました。
それが、指一つのタッチであるか、マルチタッチであるかはわかりません。
touchesにはその複数かもしれないタッチ情報が含まれているんで、
touchesに対して、anyObjectをメソッドよ呼び出す事で、タッチ情報を一つだけ取出しています。

ここからがむずいのですが、
取出したタッチ情報(aTouch)はlocationInViewメソッドで、どのビューの座標系で計算するかを
指定してタッチされた位置情報を取得します。= CGPoint pos
ただし、ビュー(UIView)が使用している座標系と、そのビューに含まれるレイヤが仕様している座標系は異なるので、
CALayerクラスのconvertPoint:toLayerを使って座標変換をしています( ̄_ ̄ i)=pos

なんとかタッチされた座標が取得できたら、その位置にあるレイヤをhitTestで取得できます。

CALayer *layer = [backView.layer hitTest:pos];

if(![layer.name hasPrefix:@"panel"] || movingLayer1 && movingLayer1 == layer){
return;
}


このlayer にリターンされてくるレイヤはbackView.layerに含まれるサブレイヤのうち、指定された位置に存在しているレイヤのみです。backView.layerそのものがリターンされている場合もあるので、
それは除外する必要があります。
パネルレイヤだけを指定したいですね。
そこで、nameプロパティがどーなっているかを調べます。
NSStringクラスのhasPrefixメソッドでレイヤの名前が"panel..."で始まっている場合だけ、
そのレイヤはパネルやった!となり処理を続けます。
それ以外の場合はリターンして処理を中断します。
あとについてるこの条件↓
movingLayer1 && movingLayer1 == layer
は、movingLayer1がnilではない(なんか設定されている)且つ、前に選ばれてるレイヤ(movingLayer1)と、
今選んだレイヤが同じ場合、成立します。
条件全体を簡単にいうと、パネル以外をタッチした場合、パネルをタッチしたけど、前回と同じパネルの場合
はリターンをしてるということです。

はい、今日はここまでです。

次回は、すでにどっかのパネルが選択されている状態でほかのパネルを選択したら時の
説明をしたいと思います。(;´▽`A``

これからもがんばりたいので、クリックお願いします(・・。)ゞ

にほんブログ村 IT技術ブログ iPhoneアプリ開発へ

にほんブログ村 携帯ブログ iPhoneへ