ShapeLayer HitTest路径不适合我

时间:2011-11-28 23:41:19

标签: objective-c ios cocoa-touch

我有一个简短的问题给你们。

我有一个shapeLayer,我在其中设置了一个框架。 然后我用UIBezierPath在框架内容中绘制一个形状,我将其设置为shapeLayer.path

问题是,我如何检测形状内的水龙头为真,而且形状外的水龙头是假的?

我一直在尝试各种疯狂的东西,但没有人在工作

-(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:似乎我无法发布图像,所以想象一个内部有对角线的矩形, 线的右侧是形状,所以我需要检测内部的点击为YES和外部(线的左侧和矩形的外部)为NO

注2:可能有帮助,但我无法理解它......我发现如果你创建一个shapeLayer并将一个CGPath添加到shapeLayer.path并且不提供框架,那么框架和shapeLayer的边界是[0,0,0,0]即使形状在屏幕上呈现,因此[view.layer hitTest:point]将找不到shapeLayer作为目标。因此,我提供了一个框架和一个绑定到我的shapeLayer。

非常感谢你的时间!

1 个答案:

答案 0 :(得分:0)

长话短说,

在图层级,我使用了从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];    

}

我必须做以下

  1. locationPoint = [ sLayer.superlayer convertPoint: locationPoint toLayer: sLayer];

  2. locationPoint = [ sLayer convertPoint: locationPoint toLayer: shapeLayer];

  3. 所以从parentLayer superLayer到它自己然后从它到childLayer

    希望能帮到某人