我有一个快速的问题要问你们。

我有一个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/

10-10 21:07