2017-02-28 94 views
0

[enter]这里有一个非闭合结构的贝塞尔路径。我只想在点击路径时检测点击,而不是在路径所包围的区域上点击。如果我使用path.contains,即使是由路径包围的点击,也会给予我真实性。如何检测内部打开的开关(不关闭)BezierPath在迅速

bezier.contains(touchPoint) 

[路径图像]:https://i.stack.imgur.com/fRmya.png具有使用以下代码创建的灰色路径,我想仅检测,而不是由灰色部分所包围的区域内关于灰色的部分的点击次数。

let color:UIColor = getColor(structure.category) 
let bpath:UIBezierPath = UIBezierPath() 
beziers.append(bpath); 
bpath.move(to: structure.points[0].fromPoint) 
for point in structure.points { 
    bpath.addCurve(to: point.toPoint, controlPoint1:point.controlPointOne, controlPoint2: point.controlPointTwo) 
} 
bpath.lineWidth = 5.0 
color.set() 
bpath.stroke() 
+0

当我意识到自己根本无法理解你所说的问题时,我正要回答一些问题。一个* unclosed *路径如何检测路径中包含的* tap *?任何机会,你可以使用更多的代码?如果你愿意,我可以帮你。 – dfd

+0

编辑上面的问题 –

+0

该路径看起来足以创建一个CAShapeLayer(同时具有笔划和填充)。如果你这样做,你可以运行一个* hitTest()*。是的,路径太小以至于胖手指(30-44点)将检测到水龙头,但我认为这是最适合水龙头检测的这种形状。 – dfd

回答

1

通过采取UIBezierPath的path属性,这是一个CGPath,并呼吁该CGPath copy(strokingWithWidth:)把你招一个闭合路径。现在,您有一个封闭的路径(或多个封闭路径),您可以成功使用CGPath contains方法。

+0

你是不是故意说我应该在这个修改后的路径中检查“contains”而不是原来的bezierpath。另外,一旦我有了原始路径的副本,我该如何将这个新路径设置为我的贝塞尔路径。 –

+0

你没有。这只是一种成功执行'contains'计算的方法。 – matt

0

要检测点是否位于任何bezierPath上并不容易,但我有一个技巧。

要检测某个点是否位于任何形状上,请将其以C的颜色呈现为位图,获取与您的坐标对应的像素并检查该像素的颜色。如果它是C那么这个点在你的形状上,否则它不会。

0

@ matt的解决方案下面是一个很好的方法来确定一个点是否接近原始路径。它与使用CGPathCreateCopyByStrokingPathsolution in this question类似。

另一种选择是使用我写的ClippingBezier库,它包含一个closestPointOnPathTo:方法。然后你可以在伪代码:

CGPoint pointOnPath = [myBezierPath closestPointOnPathTo:touchPoint]; 
CGFloat distToPath = distanceBetweenPoints(pointOnPath, touchPoint); 
if(distToPath < 5) ... 

这可能是矫枉过正,这取决于你所需要的,或者可能给依赖于别的什么,你会用你的路做一些额外的有用工具的贝塞尔。