我有一个简短的问题给你们。
我有一个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。
非常感谢你的时间!
答案 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];
}
我必须做以下
locationPoint = [ sLayer.superlayer convertPoint: locationPoint toLayer: sLayer];
locationPoint = [ sLayer convertPoint: locationPoint toLayer: shapeLayer];
所以从parentLayer superLayer到它自己然后从它到childLayer
希望能帮到某人