我在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
}
}
答案 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代码来管理水龙头。更清洁,更易于维护。