我有一个名为“ 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");
好吧,我找到了一个可行的解决方案。我创建了一个新的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");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句