我有一个快速的问题要问你们。
我有一个shapeLayer,其中设置了框架。
然后我使用设置为shapeLayer.path的UIBezierPath在框架内容内绘制形状
问题是,如何检测形状内部的抽头为真,而形状外部的抽头为假?
我一直在尝试各种疯狂的东西,但没有一个在起作用
-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer
{
CGPoint locationPoint = point;
locationPoint = [sLayer convertPoint:locationPoint toLayer:shapeLayer];
CGAffineTransform at = shapeLayer.affineTransform;
return CGPathContainsPoint([shapeLayer path],&at, locationPoint, NO);
}
-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer
{
CGPoint locationPoint = point;
locationPoint = [sLayer convertPoint:locationPoint toLayer:shapeLayer];
return [[UIBezierPath bezierPathWithCGPath:shapeLayer.path] containsPoint:locationPoint];
}
-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer
{
CGPoint locationPoint = point;
locationPoint = [sLayer convertPoint:locationPoint toLayer:shapeLayer];
CGRect theRect = CGPathGetBoundingBox(shapeLayer.path);
return CGRectContainsPoint(theRect, locationPoint);
}
注意1:看来我还不能发布图片,所以请在里面画一个带有对角线的矩形,
线的右边是形状,因此我需要将拍子内部检测为是,将外部(线的左侧和矩形的外部)检测为否
注意2:可能有帮助,但我听不懂...。我发现,如果您创建shapeLayer并将CGPath添加到shapeLayer.path中,则不提供框架,框架和即使形状在屏幕上呈现,shapeLayer的边界也为[0,0,0,0],因此[view.layer hitTest:point]不会找到shapeLayer作为目标。因此,我提供了一个框架和我的shapeLayer的绑定。
非常感谢您的宝贵时间!
最佳答案
使长话短说,
在图层级别上,我使用了从View(locationInView)获得的点,然后进行了转换,但是该图层有一个父图层,因此我需要进行两次转换
所以如果看看这种方法我前几天寄给你
-(Boolean) isPoint:(CGPoint)point InsideShape:(CSAbstractShapeLayer*) shapeLayer fromSuperLayer:(CALayer*) sLayer
{
CGPoint locationPoint = point;
locationPoint = [sLayer convertPoint:locationPoint toLayer:shapeLayer];
return [[UIBezierPath bezierPathWithCGPath:shapeLayer.path] containsPoint:locationPoint];
}
我必须执行以下操作
locationPoint = [ sLayer.superlayer convertPoint: locationPoint toLayer: sLayer];
locationPoint = [ sLayer convertPoint: locationPoint toLayer: shapeLayer];
因此,从parentLayer超级图层到自身,再从其到childLayer
希望对某人有所帮助
关于objective-c - ShapeLayer HitTest在路径上不适合我,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8303977/