我可以在表示层中访问CAShapeLayer的路径属性吗?

时间:2015-11-20 13:54:41

标签: ios cashapelayer

我有一个名为" starfish"的UIView子视图。它的背衬层是一个CAShapeLayer,它的路径是一个海星形状。我想在封闭路径中的视图控制器中对此形状进行命中测试,而不是视图的矩形。这没问题,我只是在视图控制器的touchesBegan和命中测试工作中的CAShapeLayer路径属性上调用CGPathContainsPoint()。

CGPoint p = [[touches anyObject] locationInView:self.view];
CGPoint q = [self.view convertPoint:p toView:self.starfish];

if (CGPathContainsPoint([(CAShapeLayer*)self.starfish.layer path], NULL, q, true))
    NSLog(@"Success");
else
    NSLog(@"Fail");

但是,如果视图是动画,从A移动到B,则相同的命中测试需要访问表示层中的CAShapeLayer路径,但我似乎无法访问此

// Not working during animation
if (CGPathContainsPoint([(CAShapeLayer*)self.starfish.layer.presentationLayer path], NULL, q, true))
    NSLog(@"Success");
else
    NSLog(@"Fail");

2 个答案:

答案 0 :(得分:2)

我找到了一个有效的解决方案。我创建了一个新的CAShapeLayer,它具有与我在touchesBegan中测试的CAShapelayer相同的路径和框架(基于表示层)。

CGPoint p = [[touches anyObject] locationInView:self.view];

CGRect rect = [(CAShapeLayer*)self.starfish.layer.presentationLayer frame];

CAShapeLayer *shape = [CAShapeLayer layer];
shape.path = [(CAShapeLayer*)self.starfish.layer path];
shape.frame = rect;

CGPoint q = [self.view.layer convertPoint:p toLayer:shape];

if (CGPathContainsPoint(shape.path, NULL, q, true))
    NSLog(@"Success");
else
    NSLog(@"Fail");

答案 1 :(得分:0)

之所以无法访问path属性,是因为layer.presentationLayerCALayer的属性,其本身的类型为CALayer,而不是CAShapeLayer。但是,如果该层是CAShapeLayer类型,那么根据我的经验,从layer.presentationLayerCAShapeLayer是安全的,之后您可以访问path属性。