2009-02-21 12 views
21

iPhone SDKが初めてです。今は私が本当に好きなCALayersを使ってプログラミングしています - UIViewほど高価ではなく、OpenGL ESスプライトよりもはるかに少ないコードです。CALayerでタッチイベントを取得するには?

私はこの質問があります:CALayerでタッチイベントを取得することは可能ですか?は私が

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

でのUIView上のタッチイベントを取得する方法を理解するが、私は、例えば、CALayerのオブジェクトにタッチイベントを取得する方法について、どこにでも3D空間に浮かぶオレンジ色の四角形を見つけることができません。私はこれについて興味があるのは私が唯一の人だとは信じません。

ご協力いただきありがとうございます。

答えて

29

ok-自分の質問に答えました!あなたのビューコントローラのメインレイヤーにCALayersの束があり、タッチしたときにそれらを不透明度0.5にしたいとしましょう。あなたのビューコントローラクラスの.Mファイルにこのコードを実装:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if ([touches count] == 1) { 
     for (UITouch *touch in touches) { 
      CGPoint point = [touch locationInView:[touch view]]; 
      point = [[touch view] convertPoint:point toView:nil]; 

      CALayer *layer = [(CALayer *)self.view.layer.presentationLayer hitTest:point]; 

      layer = layer.modelLayer; 
      layer.opacity = 0.5; 
     } 
    } 
} 
+1

明快さのための注意: 1. forループは、ワンタッチであることを確認してから少し不気味です。これを行う通常の方法は、[touches anyObject]または[touches objectAtIndex:0]を使用して、タッチのポインタを作成することです。 2. convertPoint:を使用する代わりに、最初はlocationInView:に "nil"を渡します。これはウィンドウ座標系のタッチ位置を与えるので、次の行は冗長です。 – Rab

+1

私はこれがかなり古い質問であることを知っています。しかし好奇心をそそる人のためだけに。 @Rab [touches objectAtIndex:0]を除いてほとんど正しいtouchesのセットを表すNSsetにはobjectAtIndexセレクタがありません。 –

+0

+1良い点@EugeneProkoshev。誰かがタッチイベントをNSArrayに入れる可能性がありますが、この場合はインデックスが作成されていないNSSetがあります。説明を明確にしてくれてありがとう。 :) – Rab

1

私は

point = [[touch view] convertPoint:point toView:self.view]; 
にそれを変更しなければならなかった私は

point = [[touch view] convertPoint:point toView:nil]; 

で間違った座標を得ていたことがわかりました

正しいレイヤーを取得するには

+0

ありがとうございました.....! – Sarah

7

最初の回答に似ています。

- (CALayer *)layerForTouch:(UITouch *)touch { 
    UIView *view = self.view; 

    CGPoint location = [touch locationInView:view]; 
    location = [view convertPoint:location toView:nil]; 

    CALayer *hitPresentationLayer = [view.layer.presentationLayer hitTest:location]; 
    if (hitPresentationLayer) { 
     return hitPresentationLayer.modelLayer; 
    } 

    return nil; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CALayer *hitLayer = [self layerForTouch:touch]; 

    // do layer processing... 
} 
関連する問題