25

iPhone SDK は初めてです。現在、私はとても気に入っている CALayers でプログラミングしています。UIViews ほど高価ではなく、OpenGL ES スプライトよりもはるかに少ないコードです。

この質問があります: CALayer でタッチ イベントを取得することは可能ですか? UIViewでタッチイベントを取得する方法を理解しています

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

しかし、CALayer オブジェクト (3D 空間に浮かぶオレンジ色の正方形など) でタッチ イベントを取得する方法についてはどこにも見つかりません。これについて興味を持っているのは私だけだとは信じられません。

どんな助けにも感謝します!

4

4 に答える 4

31

わかりました-自分の質問に答えました!ビュー コントローラーのメイン レイヤーに多数の CALayer があり、それらに触れたときに不透明度を 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;
        }
    }
}
于 2009-02-21T20:14:23.700 に答える
8

最初の回答と同様です。

- (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...
}
于 2012-08-21T06:54:13.443 に答える
1

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

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

に変更する必要がありました

point = [[touch view] convertPoint:point toView:self.view];

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

于 2012-06-17T20:18:45.373 に答える