2

boxLayer にコア アニメーション イメージがあり、それを複製して、2 番目 (boxLayer2) のアクションを変更し、位置をシフトして、誰かが 2 から選択できるようにします。

ユーザーが boxLayer の画像をタップできるようにしたいのですが、boxLayer2 画像は boxLayer の動き (タッチを受け取る以外のアニメーション コードは含めませんでした) とその逆以外は何もしません。

if ステートメントが機能しません。私は複数のバリエーションを試しました self.layer == boxLayer または CALayer == boxlayer ... sublayer は配列なので、それはアウトです。何かが欠けていることがわかっているので、助けや説明をいただければ幸いです。

ありがとう!

UIView *BounceView は VC で宣言されています

BounceView では、2 つの CALayers が宣言されています: boxlayer と boxlayer2

BounceView.m

- (id)initWithFrame:(CGRect)frame       
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setBackgroundColor:[UIColor clearColor]];


        // Create the new layer object
        boxLayer = [[CALayer alloc] init];
        boxLayer2 = [[CALayer alloc] init];

        // Give it a size
        [boxLayer setBounds:CGRectMake(0.0, 0.0, 185.0, 85.0)];
        [boxLayer2 setBounds:CGRectMake(0.0, 0.0, 185.0, 85.0)];

        // Give it a location
        [boxLayer setPosition:CGPointMake(150.0, 140.0)];
        [boxLayer2 setPosition:CGPointMake(150.0, 540.0)];

        // Create a UIImage
        UIImage *layerImage = [UIImage imageNamed:@"error-label.png"];
        UIImage *layerImage2 = [UIImage imageNamed:@"error-label.png"];

        // Get the underlying CGImage
        CGImageRef image = [layerImage CGImage];
        CGImageRef image2 = [layerImage2 CGImage];

        // Put the CGImage on the layer
        [boxLayer setContents:(__bridge id)image];
        [boxLayer2 setContents:(__bridge id)image2];

        // Let the image resize (without changing the aspect ratio) 
        // to fill the contentRect
        [boxLayer setContentsGravity:kCAGravityResizeAspect];
        [boxLayer2 setContentsGravity:kCAGravityResizeAspect];


        // Make it a sublayer of the view's layer
        [[self layer] addSublayer:boxLayer];
        [[self layer] addSublayer:boxLayer2];

    }
    return self;
}

- (void)touchesBegan:(NSSet *)touches
           withEvent:(UIEvent *)event
{
  if (CAlayer == boxLayer)
  {
  // do something
  }

  else
  {
  // do something else
  }
}
4

2 に答える 2

2

ユーザーがタッチした内側のどのレイヤーをタップしたかを知りたいと思っているようで、これがあなたの問題であるように思えます。

どのレイヤーがタップされたかを調べる方法

CALayerにはインスタンス メソッドがあります- (CALayer *)hitTest:(CGPoint)thePoint

指定されたポイントを含むレイヤー階層 (それ自体を含む) でレシーバーの最も遠い子孫を返します。

したがって、タップしたレイヤーを見つけるには、次のようにする必要があります

- (void)touchesBegan:(NSSet *)touches
           withEvent:(UIEvent *)event {
    UITouch *anyTouch = [[event allTouches] anyObject];
    CGPoint pointInView = [anyTouch locationInView:self];

    // Now you can test what layer that was tapped ...
    if ([boxLayer hitTest:pointInView]) {
        // do something with boxLayer
    } 
    // the rest of your code
}

これが機能するnilのは、ポイントがレイヤーの境界外にある場合に hitTest が返されるためです。

于 2012-06-22T09:52:27.500 に答える
0

David Rönnqvist の投稿では、レイヤーで hitTest を使用して、どのレイヤーがタッチされたかを調べる方法について説明しています。それはうまくいくはずです。ただし、そのメソッドのコーディングは少し異なります。ビューのレイヤーに boxLayer と boxLayer2 をサブレイヤーとして含め、hitTest メソッドを親レイヤーに送信します。次に、タッチを含むレイヤーを返します。

ただし、それぞれがコンテンツを含むレイヤーを持つ個別のビューを使用すると、はるかに簡単になります。次に、各ビューでジェスチャ認識機能を使用し、CA コードではなく高レベルの Cocoa Touch コードを使用してタップを管理できます。よりクリーンでメンテナンスが容易です。

于 2012-06-22T17:35:05.140 に答える