我有一个名为" 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");
答案 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.presentationLayer
是CALayer
的属性,其本身的类型为CALayer
,而不是CAShapeLayer
。但是,如果该层是CAShapeLayer
类型,那么根据我的经验,从layer.presentationLayer
到CAShapeLayer
是安全的,之后您可以访问path属性。