2

我在 boxLayer 上有一个核心动画图像,我正在复制它,改变第二个(boxLayer2)的动作和位置,以便有人可以在 2 个之间进行选择。

我希望用户能够点击 boxLayer 的图像,而 boxLayer2 图像除了 boxLayer 移动之外什么都不做(除了接收触摸之外,我没有包含我的动画代码),反之亦然。

我无法让 if 语句起作用。我尝试了多种变体 self.layer == boxLayer 或 CALayer == boxlayer ... sublayer 是一个数组,所以它已经出来了。我知道我遗漏了一些东西的任何帮助/解释将不胜感激。

谢谢!

UIView *BounceView 在VC中声明

在 BounceView 中,我声明了 2 个 CALayers:boxlayer 和 boxlayer2

弹跳视图.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 方法发送到父层。然后它将返回包含触摸的图层。

但是,如果您使用单独的视图,每个视图都有一个包含您的内容的层,它会简单得多。然后,您可以在每个视图上使用手势识别器,以及更高级别的 Cocoa Touch 代码而不是 CA 代码来管理点击。更清洁,更易于维护。

于 2012-06-22T17:35:05.140 回答