如果声明在多个CALayer之间进行选择

时间:2012-06-22 09:09:54

标签: objective-c ios if-statement core-animation calayer

我在boxLayer上有一个核心动画图像,我正在复制它,改变第二个(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
  }
}

2 个答案:

答案 0 :(得分: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
}

这是有效的,因为如果该点位于图层边界之外,hitTest将返回nil

答案 1 :(得分:0)

DavidRönnqvist的帖子告诉你如何在图层上使用hitTest来确定触摸了哪个图层。这应该工作。不过,我会稍微改变一下这种方法。我将视图的图层包含boxLayer和boxLayer2作为子图层,然后将hitTest方法发送到父图层。然后它将返回包含触摸的图层。

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